from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.db.database import SessionLocal
from app.db.models import Instrument, KPI, KPIValue
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import Request
from fastapi import Form

router = APIRouter(prefix="/admin", tags=["Admin"])

from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent
templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

# ---------------- Instrument ----------------
@router.get("/instruments")
def list_instruments(db: Session = Depends(get_db)):
    return db.query(Instrument).all()

@router.post("/instruments")
def create_instrument(symbol: str = Form(...), name: str = Form(None), db: Session = Depends(get_db)):
    if db.query(Instrument).filter_by(symbol=symbol).first():
        raise HTTPException(400, detail="Instrument already exists")
    item = Instrument(symbol=symbol, name=name)
    db.add(item)
    db.commit()
    return item

@router.delete("/instruments/{id}")
def delete_instrument(id: int, db: Session = Depends(get_db)):
    item = db.query(Instrument).get(id)
    if not item:
        raise HTTPException(404, detail="Not found")
    db.delete(item)
    db.commit()
    return {"deleted": True}

# ---------------- KPI ----------------
@router.get("/kpis")
def list_kpis(db: Session = Depends(get_db)):
    return db.query(KPI).all()

@router.post("/kpis")
def create_kpi(code: str = Form(...), name: str = Form(None), db: Session = Depends(get_db)):
    print("IN Create KPIs")
    if db.query(KPI).filter_by(code=code).first():
        raise HTTPException(400, detail="KPI already exists")
    item = KPI(code=code, name=name)
    db.add(item)
    db.commit()
    return item

@router.delete("/kpis/{id}")
def delete_kpi(id: int, db: Session = Depends(get_db)):
    item = db.query(KPI).get(id)
    if not item:
        raise HTTPException(404, detail="Not found")
    db.delete(item)
    db.commit()
    return {"deleted": True}

@router.get("/", response_class=HTMLResponse)
def admin_dashboard(request: Request):
    return templates.TemplateResponse("admin.html", {"request": request})

@router.get("/admin/instruments", response_class=HTMLResponse)
def list_instruments_html(request: Request, db: Session = Depends(get_db)):
    instruments = db.query(Instrument).all()
    html = "".join([
        f"<div class='flex justify-between items-center border-b py-1'>"
        f"<span>{i.symbol} ({i.name or ''})</span>"
        f"<button class='text-red-600' hx-delete='/admin/instruments/{i.id}' hx-target='#instrument-list' hx-swap='outerHTML'>Delete</button>"
        f"</div>" for i in instruments
    ])
    return HTMLResponse(content=f"<div id='instrument-list'>{html}</div>")

@router.get("/admin/kpis", response_class=HTMLResponse)
def list_kpis_html(request: Request, db: Session = Depends(get_db)):
    kpis = db.query(KPI).all()
    html = "".join([
        f"<div class='flex justify-between items-center border-b py-1'>"
        f"<span>{k.code} ({k.name or ''})</span>"
        f"<button class='text-red-600' hx-delete='/admin/kpis/{k.id}' hx-target='#kpi-list' hx-swap='outerHTML'>Delete</button>"
        f"</div>" for k in kpis
    ])
    return HTMLResponse(content=f"<div id='kpi-list'>{html}</div>")