"""Support for config validation using voluptuous and Translate Trigger."""
from __future__ import annotations

import calendar
import locale
import re
from typing import Any

import voluptuous as vol


def wilight_trigger(value: Any) -> str | None:
    """Check rules for WiLight Trigger."""
    step = 1
    err_desc = "Value is None"
    result_128 = False
    result_24 = False
    result_60 = False
    result_2 = False

    if value is not None:
        step = 2
        err_desc = "Expected a string"

    if (step == 2) & isinstance(value, str):
        step = 3
        err_desc = "String should only contain 8 decimals character"
        if re.search(r"^([0-9]{8})$", value) is not None:
            step = 4
            err_desc = "First 3 character should be less than 128"
            result_128 = int(value[0:3]) < 128
            result_24 = int(value[3:5]) < 24
            result_60 = int(value[5:7]) < 60
            result_2 = int(value[7:8]) < 2

    if (step == 4) & result_128:
        step = 5
        err_desc = "Hour part should be less than 24"

    if (step == 5) & result_24:
        step = 6
        err_desc = "Minute part should be less than 60"

    if (step == 6) & result_60:
        step = 7
        err_desc = "Active part should be less than 2"

    if (step == 7) & result_2:
        return value

    raise vol.Invalid(err_desc)


def wilight_to_hass_trigger(value: str | None) -> str | None:
    """Convert wilight trigger to hass description.

    Ex: "12719001" -> "sun mon tue wed thu fri sat 19:00 On"
        "00000000" -> "00:00 Off"
    """
    if value is None:
        return value

    locale.setlocale(locale.LC_ALL, "")
    week_days = list(calendar.day_abbr)
    days = bin(int(value[0:3]))[2:].zfill(8)
    desc = ""
    if int(days[7:8]) == 1:
        desc += f"{week_days[6]} "
    if int(days[6:7]) == 1:
        desc += f"{week_days[0]} "
    if int(days[5:6]) == 1:
        desc += f"{week_days[1]} "
    if int(days[4:5]) == 1:
        desc += f"{week_days[2]} "
    if int(days[3:4]) == 1:
        desc += f"{week_days[3]} "
    if int(days[2:3]) == 1:
        desc += f"{week_days[4]} "
    if int(days[1:2]) == 1:
        desc += f"{week_days[5]} "
    desc += f"{value[3:5]}:{value[5:7]} "
    if int(value[7:8]) == 1:
        desc += "On"
    else:
        desc += "Off"

    return desc
