from fastapi import APIRouter, HTTPException, status
from ..dependencies import users_token, database, mail
from ..models import users, email
from fastapi.responses import JSONResponse
from fastapi_mail import  MessageSchema, MessageType, FastMail
import random
router = APIRouter()


@router.post("/mail",tags=["mail"])
async def create_user(userSingle: users.UserCreate | None = None):
    if userSingle is None:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Body request is empty"
        )
    user_repository = users.UserRepository(database=database.database)
    user = user_repository.find_one_by({"$or": [{"username": {'$eq': userSingle.username}},{"email": {"$eq": userSingle.email}}] })
    if user is not None:
         raise HTTPException(
            status_code=status.HTTP_204_NO_CONTENT,
            detail="User is already exist"
        )

    fm = FastMail(mail.conf)
    numberkey = str(random.Random())
    key_hashed = users_token.get_password_hash(numberkey)
    email_body = {"key":key_hashed, "username":userSingle.username}
    email_schema = email.EmailSchema(email=[userSingle.email], body=email_body)
    message = MessageSchema(
        subject="Fastapi-Mail module",
        recipients=email_schema.dict().get("email"),
        template_body=email_schema.dict().get("body"),
        subtype=MessageType.html,
        )
    
    await fm.send_message(message, template_name="mailer.html") 
    current_user = users.User(username=userSingle.username, password=users_token.get_password_hash(userSingle.password), email=userSingle.email)
    user_repository.save(current_user)
    database.connect_redis.set(userSingle.username, key_hashed)
    return JSONResponse(status_code=status.HTTP_200_OK, content={"message": "email has been sent"})

@router.get("/mail",tags=["mail"])
async def confirm_user(key: str | None = None, username: str | None = None):
    if key is None or username is None:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Parameter key or/and username is empty"
        )
    user_repository = users.UserRepository(database=database.database)
    user = user_repository.find_one_by({"username": {'$eq': username}})
    key_hashed = database.connect_redis.get(username)
    if key_hashed != key:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Key is invalid"
        )
    user.confirmed = True
    user_repository.save(user)
    return JSONResponse(status_code=status.HTTP_200_OK, content={"message": "user account confirmed"})