#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
[CYBER-STRAT] Serveur principal FastAPI — port 7777
"""

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import logging
import sys
import os

# Ajouter le répertoire courant au path
sys.path.insert(0, os.path.dirname(__file__))

logging.basicConfig(
    level=logging.INFO,
    format="[CYBER-STRAT][%(asctime)s][SERVER] %(message)s"
)
logger = logging.getLogger(__name__)

app = FastAPI(
    title="Cyber Strat API",
    description="Console d'Intelligence Géopolitique — Agents Python",
    version="1.1.0"
)

# CORS — autoriser le front-end local et le PHP
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)


class QueryRequest(BaseModel):
    query: str
    entity_type: str = "concept"
    lang: str = "fr"


class SynthesisRequest(BaseModel):
    query: str
    entity_type: str = "concept"
    texts: list[str] = []


# ── Routes ────────────────────────────────────────────────────────────────────

@app.get("/")
def root():
    return {"status": "online", "service": "Cyber Strat Python API", "port": 7777}


@app.get("/health")
def health():
    """Vérifie l'état du serveur et d'Ollama"""
    import requests as req
    ollama_ok = False
    ollama_model = None
    try:
        r = req.get("http://localhost:11434/api/tags", timeout=3)
        if r.status_code == 200:
            ollama_ok = True
            models = r.json().get("models", [])
            if models:
                ollama_model = models[0]["name"]
    except Exception:
        pass

    return {
        "status": "ok",
        "ollama": ollama_ok,
        "ollama_model": ollama_model
    }


@app.post("/synthesize")
def synthesize(req: SynthesisRequest):
    """Synthèse NLP via Ollama"""
    try:
        from synthesizer import GeoSynthesizer
        synth = GeoSynthesizer()
        result = synth.synthesize(
            query=req.query,
            entity_type=req.entity_type,
            source_texts=req.texts
        )
        return {
            "status": "ok",
            "summary": result,
            "char_count": len(result),
            "within_limit": len(result) <= 1500
        }
    except Exception as e:
        logger.error(f"Erreur synthesize: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@app.post("/geo")
def geo_resolve(req: QueryRequest):
    """Résolution GPS d'une entité"""
    try:
        from geo_resolver import GeoResolver
        resolver = GeoResolver()
        geo = resolver.resolve(query=req.query, entity_type=req.entity_type)
        leaflet = resolver.build_leaflet_config(geo, req.query) if geo else None
        return {"status": "ok", "geo": geo, "leaflet": leaflet}
    except Exception as e:
        logger.error(f"Erreur geo: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@app.post("/ner")
def extract_entities(req: QueryRequest):
    """Extraction d'entités nommées"""
    try:
        from synthesizer import GeoSynthesizer
        synth = GeoSynthesizer()
        entities = synth.extract_entities(req.query)
        return {"status": "ok", "entities": entities}
    except Exception as e:
        logger.error(f"Erreur NER: {e}")
        raise HTTPException(status_code=500, detail=str(e))
