from datetime import date, datetime
from decimal import Decimal
from typing import Optional
from uuid import UUID

from pydantic import BaseModel, Field


class PlatformPaymentResponse(BaseModel):
    id: UUID
    account_id: UUID
    organization: str
    email: str
    plan: str
    amount: float
    method: Optional[str] = None
    invoice_no: Optional[str] = None
    source: str
    status: str
    payment_date: date
    created_at: datetime

    model_config = {"from_attributes": True}


class PlatformPaymentKpiResponse(BaseModel):
    total_received: float
    this_month: float
    this_month_label: str
    mrr: float
    payment_count: int


class RecordPlatformPaymentRequest(BaseModel):
    account_id: UUID
    plan: str = Field(..., pattern="^(starter|professional|enterprise)$")
    amount_cad: Decimal = Field(..., gt=0)
    method: Optional[str] = None
    invoice_no: Optional[str] = None
    source: str = Field(default="admin", pattern="^(portal|admin)$")
    status: str = Field(default="paid", pattern="^(paid|pending|failed)$")
    payment_date: date
    notes: Optional[str] = None
    subscription_id: Optional[UUID] = None
    stripe_payment_intent_id: Optional[str] = None
