from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from .. import models, schemas
from ..database import get_db
from ..security import hash_password, verify_password, create_access_token
from ..deps import get_current_user, get_current_admin

router = APIRouter()


@router.post("/register", response_model=schemas.UserResponse, status_code=201)
def register(body: schemas.UserRegister, db: Session = Depends(get_db)):
    if db.query(models.User).filter(models.User.email == body.email).first():
        raise HTTPException(status_code=400, detail="Email-ul este deja înregistrat")
    user = models.User(
        email=body.email,
        password_hash=hash_password(body.password),
        first_name=body.first_name,
        last_name=body.last_name,
        grade=body.grade,
        school=body.school,
        city=body.city,
        county=body.county,
    )
    db.add(user)
    db.commit()
    db.refresh(user)
    return user


@router.post("/login", response_model=schemas.Token)
def login(body: schemas.UserLogin, db: Session = Depends(get_db)):
    user = db.query(models.User).filter(models.User.email == body.email).first()
    if not user or not verify_password(body.password, user.password_hash):
        raise HTTPException(status_code=401, detail="Email sau parolă incorectă")
    if not user.is_active:
        raise HTTPException(status_code=403, detail="Contul este dezactivat")
    token = create_access_token({"sub": str(user.id), "user_type": "student"})
    return {"access_token": token, "token_type": "bearer", "user_type": "student"}


@router.post("/admin/login", response_model=schemas.Token)
def admin_login(body: schemas.AdminLogin, db: Session = Depends(get_db)):
    admin = db.query(models.Administrator).filter(models.Administrator.email == body.email).first()
    if not admin or not verify_password(body.password, admin.password_hash):
        raise HTTPException(status_code=401, detail="Email sau parolă incorectă")
    if not admin.is_active:
        raise HTTPException(status_code=403, detail="Contul este dezactivat")
    token = create_access_token({"sub": str(admin.id), "user_type": "admin"})
    return {"access_token": token, "token_type": "bearer", "user_type": "admin"}


@router.get("/me")
def me(current_user: models.User = Depends(get_current_user)):
    return {
        "id": str(current_user.id),
        "email": current_user.email,
        "first_name": current_user.first_name,
        "last_name": current_user.last_name,
        "grade": current_user.grade,
        "school": current_user.school,
        "city": current_user.city,
        "county": current_user.county,
        "user_type": "student",
    }


@router.get("/admin/me")
def admin_me(current_admin: models.Administrator = Depends(get_current_admin)):
    return {
        "id": str(current_admin.id),
        "email": current_admin.email,
        "first_name": current_admin.first_name,
        "last_name": current_admin.last_name,
        "role": current_admin.role,
        "user_type": "admin",
    }
