from uuid import UUID
from datetime import datetime
from typing import Optional
from pydantic import BaseModel

from app.core.module_framework.cqrs import IQuery, IQueryHandler
from app.core.postgres.base_pkg.base_client import BasePostgresClient

class ProjectDetailsDTO(BaseModel):
    """Data Transfer Object tối ưu cho màn hình hiển thị (Read Model)"""
    id: UUID
    name: str
    project_code: str
    status: str
    created_at: datetime

class GetProjectDetailsQuery(IQuery[Optional[ProjectDetailsDTO]]):
    """Ý định lấy thông tin chi tiết dự án"""
    project_id: UUID

class GetProjectDetailsQueryHandler(IQueryHandler[GetProjectDetailsQuery, Optional[ProjectDetailsDTO]]):
    """
    Xử lý Query. 
    Tuyệt đối không gọi Repository hay Entity để tránh Overhead.
    Thực thi Raw SQL trực tiếp để tối đa tốc độ đọc.
    """
    def __init__(self, postgres_client: BasePostgresClient):
        self._postgres_client = postgres_client

    def handle(self, query: GetProjectDetailsQuery) -> Optional[ProjectDetailsDTO]:
        def operation(cur):
            cur.execute("""
                SELECT id, name, project_code, status, created_at 
                FROM projects.projects 
                WHERE id = %s
            """, (str(query.project_id),))
            row = cur.fetchone()
            if row:
                return ProjectDetailsDTO(**row)
            return None
            
        # Sử dụng pool connection không cần bọc trong Transaction phức tạp (vì chỉ Read)
        return self._postgres_client._execute_with_optional_connection(None, operation)
