from fastapi import APIRouter, Depends, HTTPException, status
from motor.motor_asyncio import AsyncIOMotorDatabase
from app.api import deps
from app.core import security
from app.db.session import get_db
from app.models.schemas import User, UserRegister, UserLogin, Token
import logging

router = APIRouter()

@router.post("/register", response_model=Token)
async def register_user(
    *,
    db: AsyncIOMotorDatabase = Depends(get_db),
    user_in: UserRegister
):
    existing_user = await db.users.find_one({"email": user_in.email})
    if existing_user:
        raise HTTPException(
            status_code=400,
            detail="The user with this email already exists in the system.",
        )
    
    if len(user_in.password) < 6:
        raise HTTPException(status_code=400, detail="Password must be at least 6 characters")
        
    hashed_password = await security.get_password_hash(user_in.password)
    new_user = User(
        username=user_in.username,
        email=user_in.email,
    )
    
    user_dict = new_user.dict()
    user_dict["hashed_password"] = hashed_password
    
    await db.users.insert_one(user_dict)
    
    access_token = security.create_access_token(new_user.id)
    return Token(
        access_token=access_token,
        token_type="bearer",
        user=new_user.dict()
    )

@router.post("/login", response_model=Token)
async def login_user(
    *,
    db: AsyncIOMotorDatabase = Depends(get_db),
    user_in: UserLogin
):
    user = await db.users.find_one({"email": user_in.email})
    if not user or not await security.verify_password(user_in.password, user["hashed_password"]):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect email or password",
        )
    
    user_obj = User(**user)
    access_token = security.create_access_token(user_obj.id)
    return Token(
        access_token=access_token,
        token_type="bearer",
        user=user_obj.dict()
    )

@router.get("/me", response_model=User)
async def get_user_profile(
    current_user: User = Depends(deps.get_current_user)
):
    return current_user
