import app.api.segment.schemas as schemas
from sqlalchemy.orm import Session
from app.locale.messages import Messages
from app.models.main.segment import SegmentBase, TblSegment
from app.utils.schemas_utils import CustomResponse
from typing import List

class SegmentService:
    def __init__(self, db: Session,token):
        self.db = db
        self.token = token
    
    async def create_segment(self, request_list: List[schemas.SegmentCreate]):
        for request in request_list:
            validated_data = SegmentBase.model_validate(request)
            if not validated_data.name:
                raise ValueError("Name cannot be null")
            TblSegment.create(validated_data, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.SEGMENT_CREAT)


    async def update_segment(self, request: List[schemas.SegmentUpdate]):
        for req in request:
            updated_segment = SegmentBase.model_validate(req.model_dump())
            if updated_segment.segment_id is None:
                return CustomResponse(status="-1", message=Messages.SEGMENT_NOT_FOUND)
            TblSegment.update(updated_segment.segment_id,updated_segment, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.SEGMENT_UPDATE)

    async def get_segment(self, group_id: int):
        segment = TblSegment.get_by_group_id(group_id, self.db)
        if not segment:
            return CustomResponse(status="-1", message=Messages.SEGMENT_NOT_FOUND)
        return [schemas.SegmantResponse.model_validate(group_get) for group_get in segment]
    
    async def get_one_filed(self, group_id: int):
        get_data = self.db.query(TblSegment).filter(TblSegment.group_id == group_id).all()
        if not get_data:
            return CustomResponse(status="-1", message=Messages.SEGMENT_NOT_FOUND)
        return [schemas.OneField.model_validate(get) for get in get_data]

    async def delete_segment(self, segment_id: int):
        deleted = TblSegment.delete(segment_id, self.db)
        if not deleted:
            return CustomResponse(status="-1", message=Messages.CATCHMENT_NOT_FOUND)
        return CustomResponse(status="1", message=Messages.SEGMENT_DELETED)
