from fastapi import HTTPException
from sqlalchemy.orm import Session
from app.api.institution import schema
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from app.models.main.institution import InstitutionBase, TblInstitution
from app.models.main.user import TblUser
from app.utils.schemas_utils import CustomResponse

class InstitutionService:
    def __init__(self, db: Session, token: JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_institution(self, request: schema.InstitutionCreate):

        # Validate pydantic and convert
        created_institution = InstitutionBase.model_validate(request.model_dump())
        
        # Convert to dict and remove non-database fields
        data = created_institution.model_dump()

        # ❗ Remove fields that are NOT inside your TblInstitution model
        non_db_fields = ["simulation_count", "user"]  # Add more if needed
        for field in non_db_fields:
            data.pop(field, None)

        # Create the institution
        new_institution = TblInstitution(**data)
        self.db.add(new_institution)
        self.db.commit()
        self.db.refresh(new_institution)

        # Create admin user (admin_id = 0 means create new)
        from app.api.user.service import UserService
        user_service = UserService(self.db, self.token)

        await user_service.admin_link(
            admin_id=0,
            simulation_id=new_institution.institution_id,
            request=request.user
        )

        # Last inserted user
        user = self.db.query(TblUser).order_by(TblUser.user_id.desc()).first()

        # Assign the admin to institution
        new_institution.admin_id = user.user_id
        self.db.commit()
        self.db.refresh(new_institution)

        return CustomResponse(status="1", message=Messages.INSTITUTION)
    
    # async def create_institution(self, request: schema.InstitutionCreate):
    #     created_institution = InstitutionBase.model_validate(request.model_dump())
    #     new_institution = TblInstitution(**created_institution.model_dump())
    #     self.db.add(new_institution)
    #     self.db.commit()
    #     self.db.refresh(new_institution)
    #     from app.api.user.service import UserService
    #     user_service = UserService(self.db, self.token)
    #     await user_service.admin_link(
    #         admin_id=0,
    #         simulation_id=new_institution.institution_id,
    #         request=request.user
    #     )
    #     user = self.db.query(TblUser).order_by(TblUser.user_id.desc()).first()
    #     new_institution.admin_id = user.user_id
    #     self.db.commit()
    #     self.db.refresh(new_institution)

    #     return CustomResponse(status="1", message=Messages.INSTITUTION)

    async def geted_institution(self, institution_id: int):
        geted_data = TblInstitution.get(institution_id, self.db)
        if geted_data is None:
            raise HTTPException(status_code=404, detail="InfoTech data not found")
        from app.api.user.service import UserService
        user_service = UserService(self.db, self.token)
        user = await user_service.get_admin(institution_id)
        return {
            "institutionId": geted_data.institution_id,
            "institutionsName": geted_data.institutions_name,
            "membersCount": geted_data.members_count,
            # "simulationCount": geted_data.simulation_count,
            "user": {
                "userId": user.user_id,
                "firstName": user.first_name,
                "lastName": user.last_name,
                "emailId": user.email_id,
                "mobile_number": user.mobile_number
            } if user else None
        }


