from fastapi import HTTPException
from app.api.network.schemas import NetworkPlanningCreate, NetworkPlanningResponse, NetworkPlanningUpdate
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from app.models.main.network_plan import NetworkPlanningBase, TblNetworkPlanning
from app.utils.common_utils import calculate_total_store_counts, calculate_total_store_counts_update
from sqlalchemy.orm import Session
from app.utils.schemas_utils import CustomResponse

class NetworkPlanningService:
    def __init__(self, db: Session, token: JWTPayloadSchema):
        self.db = db
        self.token = token

    async def create_network_plan(self, request: NetworkPlanningCreate):
        store_counts = calculate_total_store_counts(request)
        new_data = NetworkPlanningBase(**request.model_dump(),**store_counts)
        TblNetworkPlanning.create(new_data, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.NETWORK_CREAT)
    
    async def get_network(self, group_id: int):
        network = TblNetworkPlanning.get_by_group_id(group_id, self.db)
        if not network:
            return CustomResponse(status="-1", message=Messages.NETWORK_NOT_FOUND, data=None)
        network_data = NetworkPlanningResponse.model_validate(network)
        return CustomResponse(status="0", message="Success", data=network_data)

    async def get_network_by_group(self, group_id: int):
        results = (self.db.query(TblNetworkPlanning).filter(TblNetworkPlanning.group_id == group_id).all())
        return [NetworkPlanningResponse.model_validate(row, from_attributes=True) for row in results]
    
    async def update_network_plan(self, request: NetworkPlanningUpdate):
        network_id = request.network_id
        existing_plan = TblNetworkPlanning.get_by_id(network_id, self.db)
        if not existing_plan:
            raise HTTPException(status_code=404, detail=Messages.NETWORK_NOT_FOUND)
        update_data = request.model_dump(exclude_unset=True)
        store_counts = calculate_total_store_counts_update(update_data, existing_plan)
        update_data.update(store_counts)
        updated_data = NetworkPlanningBase(**update_data)
        TblNetworkPlanning.update(network_id, updated_data, self.db)
        return CustomResponse(status="1", message=Messages.NETWORK_UPDATE)
    
    
   

 

