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


class SubscriptionResponse(BaseModel):
    id: UUID
    plan: str
    status: str
    billing_interval: Optional[str] = None
    current_period_start: Optional[datetime] = None
    current_period_end: Optional[datetime] = None
    cancel_at_period_end: bool = False
    stripe_subscription_id: Optional[str] = None

    model_config = {"from_attributes": True}


class PlanLimitsResponse(BaseModel):
    plan: str
    max_trees: Optional[int] = None
    max_sessions_per_month: Optional[int] = None
    max_users: Optional[int] = None
    custom_branding: bool = False
    priority_support: bool = False
    export_formats: list[str] = ["markdown", "text"]

    model_config = {"from_attributes": True}


class UsageResponse(BaseModel):
    tree_count: int
    session_count_this_month: int


class SubscriptionDetails(BaseModel):
    subscription: SubscriptionResponse
    limits: PlanLimitsResponse
    usage: UsageResponse


class SubscriptionPlanUpdate(BaseModel):
    plan: str  # free, pro, team

    model_config = {"json_schema_extra": {"examples": [{"plan": "pro"}]}}


class ExtendTrialRequest(BaseModel):
    days: int  # 1-90

    model_config = {"json_schema_extra": {"examples": [{"days": 14}]}}
