#!/usr/bin/env python3
"""HTTP server for public sites + calendar .ics + lead intake endpoint.

Сайты открыты публично (для трафика с Авито/соцсетей).
POST /api/lead принимает заявки с форм сайтов, уведомляет владельца через
Telegram-бота Виктория и сохраняет карточку лида в workspace/clients/.
"""
import http.server
import socketserver
import json
import os
import time
import random
import string
import urllib.request
import urllib.error

PORT = 8765
DIRECTORY = "/home/agent/public"
AGENT_HOME = "/home/agent"
ENV_FILE = os.path.join(AGENT_HOME, ".agent", ".env")
OWNER_FILE = os.path.join(AGENT_HOME, ".agent", "owner.json")
CLIENTS_DIR = os.path.join(AGENT_HOME, "workspace", "clients")


def load_env(path):
    env = {}
    try:
        with open(path, "r", encoding="utf-8") as f:
            for line in f:
                line = line.strip()
                if not line or line.startswith("#") or "=" not in line:
                    continue
                k, v = line.split("=", 1)
                env[k.strip()] = v.strip().strip('"').strip("'")
    except FileNotFoundError:
        pass
    return env


def load_owner_id():
    try:
        with open(OWNER_FILE, "r", encoding="utf-8") as f:
            return str(json.load(f).get("id"))
    except Exception:
        return None


def notify_owner_telegram(token, owner_id, text):
    if not token or not owner_id:
        return False
    url = f"https://api.telegram.org/bot{token}/sendMessage"
    data = json.dumps({
        "chat_id": owner_id,
        "text": text,
        "parse_mode": "HTML",
    }).encode("utf-8")
    req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"})
    try:
        with urllib.request.urlopen(req, timeout=10) as resp:
            return resp.status == 200
    except urllib.error.URLError:
        return False


def save_lead(site, payload):
    os.makedirs(CLIENTS_DIR, exist_ok=True)
    lead_id = f"web_{int(time.time())}_{''.join(random.choices(string.ascii_lowercase + string.digits, k=6))}"
    record = {
        "lead_id": lead_id,
        "source": f"site:{site}",
        "created_at": time.strftime("%Y-%m-%dT%H:%M:%S"),
        "status": "new",
        "data": payload,
    }
    path = os.path.join(CLIENTS_DIR, f"{lead_id}.json")
    with open(path, "w", encoding="utf-8") as f:
        json.dump(record, f, ensure_ascii=False, indent=2)
    return lead_id


SITE_LABELS = {
    "angelina-bask": "Анжелина Баск",
    "invest-club": "Инвестиции со смыслом",
    "prodazha-saytov": "Продажа сайтов/нейроагентов",
}


class Handler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=DIRECTORY, **kwargs)

    def log_message(self, format, *args):
        pass  # quiet mode

    def _send_json(self, status, body):
        data = json.dumps(body, ensure_ascii=False).encode("utf-8")
        self.send_response(status)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.send_header("Content-Length", str(len(data)))
        self.end_headers()
        self.wfile.write(data)

    def do_POST(self):
        if self.path != "/api/lead":
            return self._send_json(404, {"ok": False, "error": "not found"})

        length = int(self.headers.get("Content-Length", 0))
        if length <= 0 or length > 200_000:
            return self._send_json(400, {"ok": False, "error": "bad request"})
        raw = self.rfile.read(length)
        try:
            payload = json.loads(raw.decode("utf-8"))
        except Exception:
            return self._send_json(400, {"ok": False, "error": "invalid json"})

        site = str(payload.get("site", "unknown"))[:50]
        name = str(payload.get("name", "")).strip()[:200]
        contact = str(payload.get("contact", "")).strip()[:200]
        if not name or not contact:
            return self._send_json(400, {"ok": False, "error": "name and contact required"})

        clean = {k: (str(v)[:1000] if v is not None else "") for k, v in payload.items()}
        lead_id = save_lead(site, clean)

        env = load_env(ENV_FILE)
        token = env.get("VICTORIA_BOT_TOKEN")
        owner_id = load_owner_id()
        label = SITE_LABELS.get(site, site)
        extra_lines = []
        for key in ("email", "type", "message", "budget"):
            if clean.get(key):
                extra_lines.append(f"{key}: {clean[key]}")
        extra = ("\n" + "\n".join(extra_lines)) if extra_lines else ""
        text = (
            f"🌐 <b>Новая заявка с сайта «{label}»</b>\n"
            f"Имя: {name}\n"
            f"Контакт: {contact}{extra}\n"
            f"ID лида: {lead_id}"
        )
        notify_owner_telegram(token, owner_id, text)

        return self._send_json(200, {"ok": True, "lead_id": lead_id})

    def do_GET(self):
        return super().do_GET()


socketserver.TCPServer.allow_reuse_address = True
with socketserver.TCPServer(("", PORT), Handler) as httpd:
    httpd.serve_forever()
