"""
=========================================
CV6 AI Trading OS
Alerts API — JSON persistence + Telegram
=========================================
"""

import json
import pathlib
import time
import uuid
from typing import Any, Dict, List, Optional

import httpx
from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel

from app.core.dependencies import get_current_user

router = APIRouter(prefix="/alerts", tags=["Alerts"])

# Persist alerts to a JSON file in the project root
_ALERTS_FILE = pathlib.Path(__file__).resolve().parents[2] / "cv6_alerts.json"


def _load() -> List[Dict]:
    if _ALERTS_FILE.exists():
        try:
            return json.loads(_ALERTS_FILE.read_text(encoding="utf-8"))
        except Exception:
            return []
    return []


def _save(alerts: List[Dict]) -> None:
    _ALERTS_FILE.write_text(json.dumps(alerts, ensure_ascii=False, indent=2), encoding="utf-8")


# ── Schemas ───────────────────────────────────────────────────────────────────

class AlertCreate(BaseModel):
    symbol:        str
    alert_type:    str = "PRICE"        # PRICE|ORDER|POSITION|AI_SIGNAL|RISK|VOLUME|NEWS
    condition:     str = "ABOVE"        # ABOVE|BELOW|PERCENT_CHANGE
    target_value:  float = 0.0
    message:       str = ""
    channels:      List[str] = ["DESKTOP"]  # TELEGRAM|EMAIL|WHATSAPP|DESKTOP
    enabled:       bool = True


class TelegramTestPayload(BaseModel):
    bot_token: str
    chat_id:   str
    message:   Optional[str] = "CV6 AI Trading OS — Telegram test message ✅"


# ── CRUD endpoints ────────────────────────────────────────────────────────────

@router.get("/", summary="Get all alerts")
def get_alerts(_user=Depends(get_current_user)):
    return {"success": True, "alerts": _load()}


@router.post("/", summary="Create a new alert")
def create_alert(payload: AlertCreate, _user=Depends(get_current_user)):
    alerts = _load()
    alert = payload.dict()
    alert["id"]         = str(uuid.uuid4())
    alert["created_at"] = time.time()
    alert["triggered"]  = False
    alert["last_checked"] = None
    alerts.append(alert)
    _save(alerts)
    return {"success": True, "alert": alert}


@router.put("/{alert_id}", summary="Update an alert")
def update_alert(alert_id: str, payload: dict, _user=Depends(get_current_user)):
    alerts = _load()
    for i, a in enumerate(alerts):
        if a["id"] == alert_id:
            alerts[i].update(payload)
            _save(alerts)
            return {"success": True, "alert": alerts[i]}
    raise HTTPException(404, "Alert not found")


@router.delete("/{alert_id}", summary="Delete an alert")
def delete_alert(alert_id: str, _user=Depends(get_current_user)):
    alerts = _load()
    updated = [a for a in alerts if a["id"] != alert_id]
    if len(updated) == len(alerts):
        raise HTTPException(404, "Alert not found")
    _save(updated)
    return {"success": True, "deleted": alert_id}


@router.patch("/{alert_id}/toggle", summary="Enable/disable an alert")
def toggle_alert(alert_id: str, _user=Depends(get_current_user)):
    alerts = _load()
    for i, a in enumerate(alerts):
        if a["id"] == alert_id:
            alerts[i]["enabled"] = not alerts[i].get("enabled", True)
            _save(alerts)
            return {"success": True, "enabled": alerts[i]["enabled"]}
    raise HTTPException(404, "Alert not found")


# ── Telegram test ─────────────────────────────────────────────────────────────

@router.post("/test/telegram", summary="Test Telegram bot — send a test message")
def test_telegram(payload: TelegramTestPayload, _user=Depends(get_current_user)):
    url = f"https://api.telegram.org/bot{payload.bot_token}/sendMessage"
    try:
        resp = httpx.post(url, json={
            "chat_id": payload.chat_id,
            "text":    payload.message,
            "parse_mode": "HTML",
        }, timeout=10)
        data = resp.json()
        if data.get("ok"):
            return {"success": True, "message": "Telegram message sent successfully"}
        return {"success": False, "error": data.get("description", "Unknown error")}
    except httpx.TimeoutException:
        return {"success": False, "error": "Telegram request timed out"}
    except Exception as e:
        return {"success": False, "error": str(e)}


# ── Telegram send (for triggered alerts) ─────────────────────────────────────

@router.post("/send/telegram", summary="Send a Telegram alert message")
def send_telegram(payload: TelegramTestPayload, _user=Depends(get_current_user)):
    """Same as test but used programmatically by alert engine."""
    return test_telegram(payload, _user)
