from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from passlib.hash import bcrypt
from app.db import SessionLocal
from app.models.user import User
from app.schemas.user import UserCreate, Token
from app.core.security import create_token

router = APIRouter(prefix="/api/auth", tags=["Auth"])

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

@router.post("/register", response_model=Token, status_code=status.HTTP_201_CREATED)
def register(payload: UserCreate, db: Session = Depends(get_db)):
    if db.query(User).filter(User.email == payload.email).first():
        raise HTTPException(status_code=400, detail="User already exists")
    u = User(name=payload.name, email=payload.email, password=bcrypt.hash(payload.password))
    db.add(u)
    db.commit()
    db.refresh(u)
    return {"token": create_token(u.email)}

@router.post("/login", response_model=Token)
def login(payload: UserCreate, db: Session = Depends(get_db)):
    u = db.query(User).filter(User.email == payload.email).first()
    if not u or not bcrypt.verify(payload.password, u.password):
        raise HTTPException(status_code=400, detail="Invalid credentials")
    return {"token": create_token(u.email)}