# ruff: noqa: F821
from __future__ import annotations

import re
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from router import Event

DELIVERY = {
    "chat": {"type": "chat", "required": True},
    "source": {"type": "select", "choices": ["telegram", "bot"], "required": True},
    "text": {"type": "string", "min": 1, "max": 4000, "required": True},
}

class Module:
    config = {"language": {"type": "select", "label": {"ru": "Язык", "en": "Language"}, "choices": ["ru", "en"], "default": "ru"}}
    pages = [{"id": "main", "title": {"ru": "Напоминания", "en": "Reminders"}, "elements": [{"id": "tasks", "type": "tasks", "label": {"ru": "Расписание", "en": "Schedule"}}]}]

    async def language(self) -> str: return await app.config.get("language", "ru")

    @loader.command("remind", access="owner", source="both", description={"ru": "Создать напоминание", "en": "Create a reminder"}, usage="<10m> <text>")
    async def remind(self, ctx: Event) -> None:
        value = re.fullmatch(r"(\d{1,6})([smhdсмчд])\s+([\s\S]{1,4000})", ctx.args.strip())
        language = await self.language()
        if not value:
            await ctx.reply("Пример: !remind 10м проверить почту" if language == "ru" else "Example: !remind 10m check email")
            return
        amount, unit, text = value.groups()
        seconds = int(amount) * {"s": 1, "с": 1, "m": 60, "м": 60, "h": 3600, "ч": 3600, "d": 86400, "д": 86400}[unit]
        if not 1 <= seconds <= 31536000:
            await ctx.reply("Срок: от секунды до года." if language == "ru" else "Choose a delay between one second and one year.")
            return
        task = await app.tasks(self.deliver, values={"chat": ctx.chat_id, "source": ctx.source, "text": text}).after(seconds).create()
        await ctx.reply(("Напоминание сохранено: " if language == "ru" else "Reminder saved: ") + task.id)

    @loader.task(fields=DELIVERY)
    async def deliver(self, ctx: Event) -> dict:
        values = ctx.values
        if values["source"] == "bot": await app.bot.send_message(values["chat"], values["text"])
        else: await app.client.send_message(values["chat"], values["text"])
        return {"delivered": True}
