from typing import List
from fastapi import HTTPException
from sqlalchemy.orm import Session
from app.api.projected_market_share import schema
from app.models.main.projected_market_share import ProjectedMarketShareBase, TblProjectedMarketShare
from app.utils.schemas_utils import CustomResponse
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages

class ProjectedMarketShareService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_projected(self, request:schema.ProjectedMarketShareCreate):
        created_projected = ProjectedMarketShareBase.model_validate(request.model_dump())
        TblProjectedMarketShare.create_project_market(created_projected, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.PROJECTED_MARKET_SHARE)
    
    async def get_projected(self, group_id:int):
        new_get_projected = TblProjectedMarketShare.get_projected_market(group_id, self.db)
        if not new_get_projected:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.ProjectedMarketShareResponse.model_validate(get_group) for get_group in new_get_projected]
    
    async def update_projected(self, request:List[schema.ProjectedMarketShareUpdate]):
        for req in request:
            updated_projected = ProjectedMarketShareBase.model_validate(req.model_dump())
            if updated_projected.project_id is None:
                return CustomResponse("-1", message=Messages.PROJECTED_MARKET_SHARE_NOT)
            TblProjectedMarketShare.update_projected_market(updated_projected.project_id, updated_projected, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.PROJECTED_MARKET_SHARE_UPDATE)    
    
    async def delete_projected_market(self, project_id:int):
        deleted_projected_market = TblProjectedMarketShare.delete_projected_market(project_id, self.db)    
        if not deleted_projected_market:
            return CustomResponse("-1", message=Messages.PROJECTED_MARKET_SHARE_NOT)
        return CustomResponse(status="1", message=Messages.PROJECTED_MARKET_SHARE_DELETE) 