from datetime import datetime
from typing import Any

from pydantic import BaseModel, Field


class PlanOut(BaseModel):
    id: int
    key: str
    name: str
    description: str = ""
    price_cents: int
    currency: str = "EUR"
    interval: str = "month"
    sort_order: int = 0
    is_active: bool = True
    is_public: bool = True
    features: list[str] = []
    entitlements: dict[str, Any] = {}
    stripe_price_id: str | None = None

    model_config = {"from_attributes": True}


class PlanUpdateIn(BaseModel):
    name: str | None = None
    description: str | None = None
    price_cents: int | None = None
    currency: str | None = None
    interval: str | None = None
    sort_order: int | None = None
    is_active: bool | None = None
    is_public: bool | None = None
    features: list[str] | None = None
    entitlements: dict[str, Any] | None = None
    stripe_price_id: str | None = None


class BillingMeOut(BaseModel):
    plan: PlanOut
    status: str = "active"
    entitlements: dict[str, Any] = {}
    usage: dict[str, Any] = {}
    is_admin: bool = False
    stripe_enabled: bool = False


class UpgradeRequestIn(BaseModel):
    plan_key: str
    message: str = ""


class UpgradeRequestOut(BaseModel):
    id: int
    user_id: int
    plan_id: int
    status: str
    message: str = ""
    admin_note: str = ""
    created_at: datetime | None = None
    resolved_at: datetime | None = None
    user_email: str | None = None
    plan_key: str | None = None
    plan_name: str | None = None

    model_config = {"from_attributes": True}


class AssignPlanIn(BaseModel):
    plan_key: str
    notes: str = ""


class AdminUserOut(BaseModel):
    id: int
    email: str
    name: str
    is_admin: bool
    is_active: bool
    plan_key: str | None = None
    plan_name: str | None = None
    created_at: datetime | None = None


class AdminStatsOut(BaseModel):
    users: int
    jobs: int
    sources: int
    sources_enabled: int
    pending_upgrades: int
    applications: int


class StripeCheckoutIn(BaseModel):
    plan_key: str
    success_url: str = Field(default="http://127.0.0.1:8010/pricing?ok=1")
    cancel_url: str = Field(default="http://127.0.0.1:8010/pricing?cancel=1")


class StripeCheckoutOut(BaseModel):
    ok: bool
    mode: str  # stub | stripe
    detail: str
    checkout_url: str | None = None
