from datetime import datetime
from decimal import Decimal
from uuid import UUID

from sqlalchemy import func, select
from sqlalchemy.orm import Session

from app.models.day_close import DayClose
from app.models.sale import Sale, SalePayment


def expected_cash(db: Session, business_id: UUID, branch_id: UUID, period_start: datetime, period_end: datetime) -> Decimal:
    total = db.scalar(
        select(func.coalesce(func.sum(SalePayment.amount), 0)).join(Sale, Sale.id == SalePayment.sale_id).where(
            SalePayment.business_id == business_id,
            Sale.branch_id == branch_id,
            Sale.lifecycle_status == "COMPLETED",
            SalePayment.payment_method == "CASH",
            SalePayment.paid_at >= period_start,
            SalePayment.paid_at < period_end,
        )
    )
    return Decimal(total).quantize(Decimal("0.01"))


def overlaps_existing_close(db: Session, business_id: UUID, branch_id: UUID, period_start: datetime, period_end: datetime) -> bool:
    return db.scalar(select(DayClose.id).where(
        DayClose.business_id == business_id,
        DayClose.branch_id == branch_id,
        DayClose.period_start < period_end,
        DayClose.period_end > period_start,
    ).limit(1)) is not None
