from datetime import date

from app.sales.repository import SalesRepository
from app.sales.schemas import (
    Pagination,
    SalesDetailResponse,
    SalesListItem,
    SalesListResponse,
)


class SalesService:
    def __init__(self, repository: SalesRepository) -> None:
        self._repository = repository

    async def list_sales(
        self,
        *,
        month: int,
        year: int,
        sales_date: date | None = None,
        only_unlocked: bool,
        kode_sales: str | None = None,
        page: int,
        page_size: int,
    ) -> SalesListResponse:
        rows, total = await self._repository.list_sales(
            month=month,
            year=year,
            sales_date=sales_date,
            only_unlocked=only_unlocked,
            kode_sales=kode_sales,
            limit=page_size,
            offset=(page - 1) * page_size,
        )
        return SalesListResponse(
            data=[SalesListItem.model_validate(row) for row in rows],
            pagination=Pagination(
                page=page,
                page_size=page_size,
                total=total,
                total_pages=(total + page_size - 1) // page_size,
            ),
        )

    async def get_sale(
        self, kodesi: str, *, kode_sales: str | None = None
    ) -> SalesDetailResponse | None:
        row = await self._repository.get_sale(kodesi, kode_sales=kode_sales)
        return SalesDetailResponse.model_validate(row) if row else None
