from app.models import Chat
from app.database import get_db
from sqlalchemy.orm import Session
from fastapi import Depends, HTTPException, Request
from app.models import User, UserAssignedAvatar, Avatar
from sqlalchemy import select
from fastapi.responses import JSONResponse
from typing import List
from urllib.parse import urljoin


def get_full_url(path: str, request: Request):
    if not path:
        return None
    return urljoin(str(request.base_url), f"glb_avatars/{path.lstrip('/')}")


def getUserAvatars(current_user: User, db: Session, request: Request):

    try:
        #Get avatars assigned to the user with avatar info
        user_avatars = (
            db.query(
                Avatar,
                UserAssignedAvatar.user_id,
                UserAssignedAvatar.avatar_name
            )
            .join(UserAssignedAvatar, UserAssignedAvatar.avatar_id == Avatar.id)
            .filter(UserAssignedAvatar.user_id == current_user.id)
            .all()
        )

        assigned_ids = [row.Avatar.id for row in user_avatars]

        # 🔍 Get avatars NOT assigned to the user
        other_avatars = (
            db.query(Avatar)
            .filter(~Avatar.id.in_(assigned_ids))
            .all()
        )

        # 🧩 Merge both sets
        merged_avatars = []

        for row in user_avatars:
            avatar = row.Avatar
            merged_avatars.append({
                "id": avatar.id,
                "name": row.avatar_name,
                "image": get_full_url(avatar.image, request),
                "glb": get_full_url(avatar.glb, request),
                "gender": avatar.gender
            })

        for avatar in other_avatars:
            merged_avatars.append({
                "id": avatar.id,
                "name": avatar.name,
                "image": get_full_url(avatar.image, request),
                "glb": get_full_url(avatar.glb, request),
                "gender": avatar.gender
            })

        return {
            "status": True,
            "avatar": merged_avatars
        }

    except Exception as e:
        raise HTTPException(status_code=500, detail={
            "status": False,
            "message": "Something went wrong.",
            "errors": str(e)
        })

def saveAvatar(avatar_id: int, avatar_name: str, current_user: User, db: Session):
    try:
        user_id = current_user.id

        #Upsert: update if exists, else insert
        existing = db.query(UserAssignedAvatar).filter_by(
            user_id=user_id,
            avatar_id=avatar_id
        ).first()

        if existing:
            existing.avatar_name = avatar_name
        else:
            new_avatar = UserAssignedAvatar(
                user_id=user_id,
                avatar_id=avatar_id,
                avatar_name=avatar_name
            )
            db.add(new_avatar)

        db.commit()

        return JSONResponse(status_code=200, content={
            "status": True,
            "message": "Avatar name updated successfully."
        })

    except Exception as e:
        db.rollback()
        return JSONResponse(status_code=500, content={
            "status": False,
            "message": "Something went wrong.",
            "errors": str(e)
        })
