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

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

class PartnerDetailsDTO(BaseModel):
    id: UUID
    name: str
    tax_code: Optional[str]
    type: str
    address: Optional[str]
    created_at: datetime

class GetPartnerDetailsQuery(IQuery[Optional[PartnerDetailsDTO]]):
    partner_id: UUID

class GetPartnerDetailsQueryHandler(IQueryHandler[GetPartnerDetailsQuery, Optional[PartnerDetailsDTO]]):
    def __init__(self, postgres_client: BasePostgresClient):
        self._postgres_client = postgres_client

    def handle(self, query: GetPartnerDetailsQuery) -> Optional[PartnerDetailsDTO]:
        def operation(cur):
            cur.execute("""
                SELECT id, name, tax_code, type, address, created_at 
                FROM partners.partners 
                WHERE id = %s
            """, (str(query.partner_id),))
            row = cur.fetchone()
            if row:
                return PartnerDetailsDTO(**row)
            return None
            
        return self._postgres_client._execute_with_optional_connection(None, operation)
