from __future__ import annotations

import asyncio
from datetime import datetime

from telegram.ext import Application, CommandHandler, MessageHandler, filters

from .ai import AiAssistant
from .api_client import ApiClient
from .commands.cases import case_alias, list_cases, show_case, status_case
from .commands.general import help_command, start
from .commands.tasks import list_hearings, list_tasks, show_task
from .config import get_settings
from .parsers import clean_ai_tags, parse_ai_tag, parse_pipe_tag, parse_reminder_tag
from .storage import load_json, save_json


async def handle_text(update, context) -> None:
    settings = context.bot_data["settings"]
    ai = context.bot_data["ai"]
    user_id = str(update.effective_user.id)
    text = update.message.text or ""

    reply = ai.reply(user_id, text)
    await apply_ai_actions(update, context, reply)

    clean = clean_ai_tags(reply)
    if clean:
        await update.message.reply_text(clean)


async def apply_ai_actions(update, context, reply: str) -> None:
    settings = context.bot_data["settings"]
    api = context.bot_data["api"]
    user_id = str(update.effective_user.id)
    chat_id = update.effective_chat.id

    reminder = parse_reminder_tag(reply)
    if reminder:
        path = settings.data_dir / "reminders.json"
        reminders = load_json(path, {})
        reminders[f"{user_id}_{int(reminder.when.timestamp())}"] = {
            "chat_id": chat_id,
            "datetime": reminder.when.isoformat(),
            "message": reminder.message,
        }
        save_json(path, reminders)
        await update.message.reply_text(f"Xatırlatma quruldu: {reminder.when:%d.%m.%Y %H:%M}")

    case_parts = parse_pipe_tag("IS_ELAVE", reply)
    if case_parts and len(case_parts) >= 5:
        result = api.post(
            "elave_et",
            {
                "is_nomresi": case_parts[0],
                "terefin_adi": case_parts[1],
                "mehkemenin_adi": case_parts[2],
                "hakimin_adi": case_parts[3],
                "is_statusu": case_parts[4],
                "mehkeme_tarixi": case_parts[5] if len(case_parts) > 5 else None,
                "qeydler": case_parts[6] if len(case_parts) > 6 else "",
            },
        )
        if result.get("success"):
            await update.message.reply_text(f"İş əlavə edildi. ID: {result.get('id')}")

    task_parts = parse_pipe_tag("TASK_ELAVE", reply)
    if task_parts and len(task_parts) >= 2:
        result = api.post(
            "tapshiriq_elave",
            {
                "is_id": task_parts[0],
                "mezmun": task_parts[1],
                "prioritet": task_parts[2] if len(task_parts) > 2 else 0,
                "son_tarix": task_parts[3] if len(task_parts) > 3 else None,
                "mesul": task_parts[4] if len(task_parts) > 4 else "",
                "qeydler": task_parts[5] if len(task_parts) > 5 else "",
            },
        )
        if result.get("success"):
            await update.message.reply_text(f"Tapşırıq əlavə edildi. ID: {result.get('id')}")

    search_number = parse_ai_tag("IS_TAP", reply)
    if search_number:
        result = api.get("nomre_ile", {"nomre": search_number})
        await update.message.reply_text(str(result.get("data", []))[:3500])


async def check_reminders(context) -> None:
    settings = context.bot_data["settings"]
    path = settings.data_dir / "reminders.json"
    reminders = load_json(path, {})
    now = datetime.now()
    remaining = {}

    for key, item in reminders.items():
        due = datetime.fromisoformat(item["datetime"])
        if due <= now:
            await context.bot.send_message(chat_id=item["chat_id"], text=f"Xatırlatma: {item['message']}")
        else:
            remaining[key] = item

    if len(remaining) != len(reminders):
        save_json(path, remaining)


async def post_init(application: Application) -> None:
    application.job_queue.run_repeating(check_reminders, interval=60, first=10)


def build_application() -> Application:
    settings = get_settings()
    if not settings.telegram_token:
        raise RuntimeError("TELEGRAM_TOKEN is missing")

    api = ApiClient(settings.api_url, settings.api_token)
    app = Application.builder().token(settings.telegram_token).post_init(post_init).build()
    app.bot_data["settings"] = settings
    app.bot_data["api"] = api
    app.bot_data["ai"] = AiAssistant(settings, api)

    app.add_handler(CommandHandler("start", start))
    app.add_handler(CommandHandler("help", help_command))
    app.add_handler(CommandHandler("is", show_case))
    app.add_handler(CommandHandler("isler", list_cases))
    app.add_handler(CommandHandler("status", status_case))
    app.add_handler(CommandHandler("tasks", list_tasks))
    app.add_handler(CommandHandler("iclaslar", list_hearings))
    app.add_handler(MessageHandler(filters.Regex(r"^/case\d+$"), case_alias))
    app.add_handler(MessageHandler(filters.Regex(r"^/task\d+$"), show_task))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text))
    return app


def main() -> None:
    build_application().run_polling()


if __name__ == "__main__":
    main()
