import logging

from flask import Flask, jsonify, request

from .clients import TelegramClient
from .config import BotConfig
from .handlers import BotService


def create_app() -> Flask:
    config = BotConfig.from_env()
    logging.basicConfig(
        level=getattr(logging, config.bot_log_level.upper(), logging.INFO),
        format="%(asctime)s %(levelname)s %(name)s: %(message)s",
    )

    app = Flask(__name__)
    app.config["BOT_CONFIG"] = config
    bot_service = BotService(config)

    @app.get("/health")
    def health() -> tuple:
        return jsonify(
            {
                "ok": True,
                "bot_name": config.bot_name,
                "laravel_write_enabled": config.bot_enable_laravel_write,
            }
        ), 200

    @app.post("/send-message")
    def send_message() -> tuple:
        payload = request.get_json(silent=True) or {}
        chat_id = payload.get("chat_id")
        text = payload.get("text")
        if not chat_id or not text:
            return jsonify({"ok": False, "message": "chat_id dan text wajib."}), 422
        telegram = TelegramClient(config)
        try:
            result = telegram.send_message(int(chat_id), str(text))
            return jsonify({"ok": True, "result": result}), 200
        except Exception as exc:
            return jsonify({"ok": False, "message": str(exc)}), 500

    @app.post("/telegram/webhook")
    def telegram_webhook() -> tuple:
        secret_header = request.headers.get("X-Telegram-Bot-Api-Secret-Token", "")

        if not bot_service.is_webhook_secret_valid(secret_header):
            return jsonify({"ok": False, "message": "invalid webhook secret"}), 403

        update = request.get_json(silent=True) or {}
        bot_service.handle_update(update)

        return jsonify({"ok": True}), 200

    return app
