from fastapi import APIRouter, Request, Response, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from db.session import get_db
from services.auth_service import AuthService
from schemas.auth import RegisterRequest, LoginRequest, RefreshRequest, AuthResponse, UserResponse
from api.deps import get_current_user
from models.user import User

router = APIRouter()

@router.post("/register", status_code=status.HTTP_201_CREATED)
async def register(data: RegisterRequest, db: AsyncSession = Depends(get_db)):
    service = AuthService(db)
    user = await service.register(data.email, data.password, data.name)
    return {"message": "User created successfully", "user_id": user.id}

@router.post("/login", response_model=AuthResponse)
async def login(
    data: LoginRequest,
    request: Request,
    response: Response,
    db: AsyncSession = Depends(get_db)
):
    service = AuthService(db)
    result = await service.login(
        data.email,
        data.password,
        user_agent=request.headers.get("user-agent"),
        ip_address=request.client.host
    )
    # Set refresh token as HttpOnly cookie
    response.set_cookie(
        key="refresh_token",
        value=result["refresh_token"],
        httponly=True,
        secure=True,  # set to False if not using HTTPS in dev
        samesite="strict",
        max_age=30*24*60*60  # 30 days
    )
    return {"access_token": result["access_token"], "refresh_token": result["refresh_token"]}

@router.post("/refresh", response_model=AuthResponse)
async def refresh(
    request: Request,
    response: Response,
    db: AsyncSession = Depends(get_db)
):
    refresh_token = request.cookies.get("refresh_token")
    if not refresh_token:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Refresh token missing")
    service = AuthService(db)
    result = await service.refresh(
        refresh_token,
        user_agent=request.headers.get("user-agent"),
        ip_address=request.client.host
    )
    # Update cookie with new refresh token
    response.set_cookie(
        key="refresh_token",
        value=result["refresh_token"],
        httponly=True,
        secure=True,
        samesite="strict",
        max_age=30*24*60*60
    )
    return {"access_token": result["access_token"], "refresh_token": result["refresh_token"]}

@router.post("/logout")
async def logout(
    request: Request,
    response: Response,
    db: AsyncSession = Depends(get_db)
):
    refresh_token = request.cookies.get("refresh_token")
    if refresh_token:
        service = AuthService(db)
        await service.logout(refresh_token)
    response.delete_cookie("refresh_token")
    return {"message": "Logged out"}

@router.post("/logout-all")
async def logout_all(
    current_user: User = Depends(get_current_user),
    db: AsyncSession = Depends(get_db)
):
    service = AuthService(db)
    await service.logout_all(current_user.id)
    return {"message": "All sessions logged out"}

@router.get("/me", response_model=UserResponse)
async def get_me(current_user: User = Depends(get_current_user)):
    return UserResponse(
        id=current_user.id,
        email=current_user.email,
        name=current_user.name,
        is_active=current_user.is_active,
        is_verified=current_user.is_verified,
        is_admin=current_user.is_admin
    )
