# ruff: noqa: F821
from __future__ import annotations

import time
import uuid
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from router import Event

TEXT = {"text": {"type": "string", "label": {"ru": "Текст", "en": "Text"}, "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": "Saved text"}, "elements": [
        {"id": "items", "type": "table", "label": {"ru": "Последние записи", "en": "Recent entries"}, "columns": ["id", "text"]},
        {"id": "save", "type": "form", "action": "save", "label": {"ru": "Сохранить текст", "en": "Save text"}},
        {"id": "find", "type": "form", "action": "find", "label": {"ru": "Поиск по тексту", "en": "Search text"}},
        {"id": "remove", "type": "form", "action": "remove", "label": {"ru": "Удалить запись", "en": "Remove entry"}},
    ]}]

    async def init(self) -> None: await self.publish()

    async def publish(self) -> None:
        index = await app.db.get("index", default=[])
        rows = []
        for key in index[-30:][::-1]:
            value = await app.db.get("notes/" + key)
            if value: rows.append({"id": key, "text": value["text"][:120]})
        await app.ui.set("main", {"items": rows})

    async def store(self, text: str, chat=None, message=None) -> dict:
        index = await app.db.get("index", default=[])
        if len(index) >= 100: raise ValueError("The collection contains 100 entries; remove an entry first")
        key = uuid.uuid4().hex
        value = {"id": key, "text": text, "created": time.time(), "chat": chat, "message": message}
        await app.db.batch().set("index", [*index, key]).set("notes/" + key, value).commit()
        await self.publish()
        return value

    @loader.command("keep", access="owner", source="both", description={"ru": "Сохранить текст из команды", "en": "Save text from a command"}, usage="<text>")
    async def keep(self, ctx: Event) -> None:
        language = await app.config.get("language", "ru")
        text = ctx.args.strip()
        if not text or len(text) > 4000:
            await ctx.reply("Использование: !keep текст, до 4000 символов." if language == "ru" else "Usage: !keep text, up to 4000 characters.")
            return
        saved = await self.store(text, ctx.chat_id, ctx.id)
        await ctx.reply(("Сохранено: " if language == "ru" else "Saved: ") + saved["id"])

    @loader.action(fields=TEXT, access="owner")
    async def save(self, ctx: Event) -> dict: return await self.store(ctx.values["text"])

    @loader.action(fields={"query": {"type": "string", "label": {"ru": "Поисковый запрос", "en": "Search query"}, "min": 1, "max": 128, "required": True}}, access="owner")
    async def find(self, ctx: Event) -> dict:
        query, found = ctx.values["query"].casefold(), []
        for key in await app.db.get("index", default=[]):
            value = await app.db.get("notes/" + key)
            if value and query in value["text"].casefold(): found.append({"id": key, "text": value["text"][:240]})
        return {"items": found[:30]}

    @loader.action(fields={"id": {"type": "string", "label": {"ru": "Номер записи", "en": "Entry ID"}, "required": True}}, access="owner", confirm=True)
    async def remove(self, ctx: Event) -> dict:
        key = ctx.values["id"]
        index = await app.db.get("index", default=[])
        if key not in index: return {"removed": False}
        await app.db.batch().set("index", [value for value in index if value != key]).delete("notes/" + key).commit()
        await self.publish()
        return {"removed": True}
