from fastapi import APIRouter, HTTPException, Depends
from starlette import status

from src.api.dependencies import get_repository
from src.data.model.schemas import UserData
from src.data.repositories.user import UserRepository
from src.utils.jwt import verify_password
from src.mailing import mailing

router = APIRouter(prefix="/users", tags=["users"])


@router.post(
    '/login',
    summary="Create access and refresh tokens for user",
    operation_id="login",
    response_model=dict[str, str])
async def login(
        user: UserData,
        login: UserRepository = Depends(get_repository(repo_type=UserRepository))
):
    if user.is_agent and user.username.isdigit():
        user.username = await login.get_agent_username_by_partner(user.username)

    hash = await login.get_password_hash(user.username)
    if not hash:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Incorrect username or password"
        )

    if not verify_password(user.password, hash):
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Incorrect username or password"
        )
    result = {
        "Success": True,
        "First": user.password == user.username
    }
    print(result)
    return result


@router.post(
    "/change_password/",
    summary="Changes password of user given by username",
    operation_id="changePassword"
)
async def change_password(
        user: UserData,
        login: UserRepository = Depends(get_repository(repo_type=UserRepository))
):
    changed, email = await login.change_password(user)
    if user.email:
        mailing.send_changed_password(user.email, user)
    elif email:
        mailing.send_changed_password(email, user)

    return {
        "Success": changed
    }
