from sqlalchemy.ext.asyncio import AsyncSession
from src.models.project.models import Project
from sqlalchemy import select
from src.request.project.ProjectRequest import ProjectCreateRequest, ProjectUpdateRequest, ProjectDDL
from datetime import datetime,timezone

class ProjectRepo:
    def __init__(self,session:AsyncSession) -> None:
        self.session = session
        
    async def create(self, project:ProjectCreateRequest, user_id: int) -> Project:
        record=Project(**project.model_dump())
        record.created_by = user_id
        self.session.add(record)
        await self.session.commit()
        await self.session.refresh(record)
        return record

    async def update(self, id: int, update_data: ProjectUpdateRequest, user_id:int) -> Project:        
        db_state=await self.find(id)
        if not db_state:
            return None
        for key,value in update_data.model_dump(exclude_unset=True).items():
            setattr(db_state,key,value)

        db_state.updated_at = datetime.now(timezone.utc)
        db_state.updated_by=user_id
        await self.session.commit()
        await self.session.refresh(db_state)
        return db_state

    async def find(self, id: int) -> Project | None:
        result=await self.session.execute(select(Project).where(Project.id==id))
        return result.scalar_one_or_none()
    
    async def readAll(self) -> list[Project]:
        result = await self.session.execute(select(Project))
        return result.scalars().all()
    
    async def readAllDDL(self) -> list[ProjectDDL]:
        result = await self.session.execute(
            select(Project.id, Project.name)
            .order_by(Project.name)
        )
        rows = result.all()   # returns list of Row objects (tuples)
        return [ProjectDDL(id=row.id, name=row.name) for row in rows]