from fastapi import APIRouter, HTTPException, status
from src.models.user_schema import Users
from src.db.mongodb import users_collection
from fastapi import Form
from src.controllers.auth_service import has_password
from jose import JWTError, jwt
from src.config import settings

router = APIRouter()

def transform_mongo_result(document):
    if "_id" in document:
        document["_id"] = str(document["_id"])
    return document

def is_user_exist(email: str) -> bool:
    return users_collection.find_one({"email": email}) is not None

def get_user_details(email: str):
    user = users_collection.find_one({"email": email})
    if user:
        return transform_mongo_result(user)
    return {"error": "User not found"}

def get_user_form(
    name: str = Form(...),
    mobile: str = Form(...),
    email: str = Form(...),
    password: str = Form(...),
    address: str = Form(...),
    city: str = Form(...),
    state: str = Form(...),
    pincode: str = Form(...)
) -> Users:
    return Users(
        name=name,
        mobile=mobile,
        email=email,
        password=password,
        address=address,
        city=city,
        state=state,
        pincode=pincode
    )

def create_user_dict(data, image_path):
    return {
        "name": data['name'],
        "mobile": data['mobile'],
        "email": data['email'],
        "password": has_password(data['password']),
        "address": data['address'],
        "city": data['city'],
        "state": data['state'],
        "pincode": data['pincode'],
        "profile_image": image_path
    }

def save_user(data, image_path: str):
    user_doc = create_user_dict(data, image_path)
    users_collection.insert_one(user_doc)

def get_current_user(token):
    try: 
        credentials_exception = HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Could not validate credentials",
            headers={"Authorization": "Bearer"},
        )
        try:
            payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
            email: str = payload.get("email")
            if email is None:
                raise credentials_exception
        except JWTError:
            raise credentials_exception
        
        user_res = users_collection.find_one({"email": email}, { "password": 0 })
        if user_res is None:
            raise 'User not found.'

        user_data = {
            "user_id": str(user_res["_id"]),
            "name": user_res.get("name", ""),
            "email": user_res.get("email", ""),
            "mobile": user_res.get("mobile", ""),
            "address": user_res.get("address", ""),
            "city": user_res.get("city", ""),
            "state": user_res.get("state", ""),
            "pincode": user_res.get("pincode", ""),
            "profile_image": user_res.get("profile_image", "").replace("\\", "/")
        }
        return user_data
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error on fetching user details: {str(e)}")
