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, ApiLog, AdminUser
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import Request
from fastapi import Form
import bcrypt
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>")

@router.get("/api-logs")
def list_api_logs(db: Session = Depends(get_db)):
    logs = db.query(ApiLog).order_by(ApiLog.timestamp.desc()).all()
    return [log.as_dict() for log in logs]

@router.get("/admin/api-logs", response_class=HTMLResponse)
def list_api_logs_html(request: Request, db: Session = Depends(get_db)):
    logs = db.query(ApiLog).order_by(ApiLog.timestamp.desc()).all()
    html = "".join([
        f"<div class='flex justify-between items-center border-b py-1 text-xs'>"
        f"<div class='flex-1 truncate'>{log.timestamp.strftime('%Y-%m-%d %H:%M:%S')} – <b>{log.method}</b> {log.endpoint}</div>"
        f"<div class='w-24 text-right'>{log.response_status or '-'}</div>"
        f"</div>" for log in logs
    ]) or "<p class='text-gray-500'>No logs yet.</p>"
    return HTMLResponse(content=f"<div id='api-log-list'>{html}</div>")


@router.post("/users")
def create_user(
    username: str = Form(...),
    password: str = Form(None),
    db: Session = Depends(get_db)
):
    # Check if user already exists
    existing_user = db.query(AdminUser).filter_by(username=username).first()
    if existing_user:
        raise HTTPException(400, detail="User already exists.")

    # Create new user
    hashed_password = bcrypt.hashpw(
        password.encode("utf-8"),
        bcrypt.gensalt()
    ).decode("utf-8")

    item = AdminUser(username=username, password=hashed_password, is_superuser=False, is_active=True)
    db.add(item)
    db.commit()

    return {"success": True, "message": "User created successfully"}
