"""
Мини-сервер для лендингов Fusion Inn.
Раздаёт статику и принимает заявки с телефоном.
При получении заявки — отправляет уведомление в Telegram-бот.
"""

import os
import json
import asyncio
from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib.parse import urlparse
import urllib.request

BOT_TOKEN = os.getenv("BOT_TOKEN", "8793748497:AAHdlE_SHutz5dXHQbaqV1dimx9Y_xkUUC4")
ADMIN_CHAT_ID = os.getenv("ADMIN_CHAT_ID", "300915007")
PORT = int(os.getenv("LANDING_PORT", "8080"))

LANDING_DIR = os.path.dirname(os.path.abspath(__file__))

SCENARIO_NAMES = {
    "recharge": "Перезагрузка",
    "birthday": "День рождения",
    "proposal": "Предложение / Свадебное путешествие",
    "anniversary": "Годовщина",
    "travel": "Путешествие по Алтаю",
}

ROUTES = {
    "/discover": "discover.html",
    "/plan": "booking.html",
    "/booking": "booking.html",
}


def send_telegram_notification(phone, scenario, days, segment):
    scenario_name = SCENARIO_NAMES.get(scenario, scenario)
    text = (
        f"Новая заявка с лендинга!\n\n"
        f"Телефон: {phone}\n"
        f"Сценарий: {scenario_name}\n"
        f"Дни: {days}\n"
        f"Сегмент: {segment}"
    )
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
    data = json.dumps({"chat_id": ADMIN_CHAT_ID, "text": text}).encode()
    req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"})
    try:
        urllib.request.urlopen(req, timeout=5)
    except Exception as e:
        print(f"Failed to send notification: {e}")


class LandingHandler(SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=LANDING_DIR, **kwargs)

    def do_GET(self):
        parsed = urlparse(self.path)
        path = parsed.path.rstrip("/")

        # Route /discover and /booking to HTML files
        if path in ROUTES:
            file_path = os.path.join(LANDING_DIR, ROUTES[path])
            self.send_response(200)
            self.send_header("Content-Type", "text/html; charset=utf-8")
            self.end_headers()
            with open(file_path, "rb") as f:
                self.wfile.write(f.read())
            return

        # Serve static files (CSS, JS, images)
        super().do_GET()

    def do_POST(self):
        if self.path == "/api/lead":
            content_length = int(self.headers.get("Content-Length", 0))
            body = self.rfile.read(content_length)
            try:
                data = json.loads(body)
                phone = data.get("phone", "").strip()
                scenario = data.get("scenario", "unknown")
                days = data.get("days", "unknown")
                segment = data.get("segment", "unknown")

                if phone:
                    send_telegram_notification(phone, scenario, days, segment)
                    print(f"Lead: {phone} | {scenario} | {days} | {segment}")

                self.send_response(200)
                self.send_header("Content-Type", "application/json")
                self.end_headers()
                self.wfile.write(b'{"ok": true}')
            except Exception as e:
                self.send_response(400)
                self.end_headers()
                self.wfile.write(str(e).encode())
        else:
            self.send_response(404)
            self.end_headers()

    def log_message(self, format, *args):
        print(f"[landing] {args[0]}")


if __name__ == "__main__":
    print(f"Landing server starting on port {PORT}...")
    server = HTTPServer(("127.0.0.1", PORT), LandingHandler)
    server.serve_forever()
