"""Admin domain - SQLAlchemy models.

Admin-managed tables that mirror/drive Stripe configuration.
Plans are created and updated here, then synced to Stripe via the API.

Platform admins are stored in a dedicated `admins` table (user_id -> admin record).
"""
from __future__ import annotations
from datetime import datetime
from typing import Optional
from uuid import UUID, uuid4

from sqlalchemy import BigInteger, Boolean, ForeignKey, Integer, String, Text
from sqlalchemy.dialects.postgresql import JSONB, UUID
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy.sql import func
from sqlalchemy.types import DateTime

from src.core.database import Base


class Admin(Base):
    """Platform admin - users with admin access (plan management, etc.).

    Presence in this table grants admin privileges. No row = regular user.
    """
    __tablename__ = "admins"

    id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid4)
    user_id: Mapped[UUID] = mapped_column(
        UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), unique=True, nullable=False
    )
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
    created_by: Mapped[Optional[UUID]] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="SET NULL"), nullable=True)


class SubscriptionPlan(Base):
    """Admin-managed subscription plans.

    Each plan maps to a Stripe Product + Price.
    Admins create/update plans here; the service syncs to Stripe.
    """
    __tablename__ = "subscription_plans"

    id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid4)
    name: Mapped[str] = mapped_column(String(100), nullable=False)
    slug: Mapped[str] = mapped_column(String(50), nullable=False, unique=True)
    description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)

    price_monthly: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
    price_yearly: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
    currency: Mapped[str] = mapped_column(String(10), nullable=False, default="usd")

    stripe_product_id: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    stripe_monthly_price_id: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    stripe_yearly_price_id: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)

    features: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
    limits: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
    sort_order: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
    trial_days: Mapped[int] = mapped_column(Integer, default=0, nullable=False)

    includes_metered_billing: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
    metered_stripe_price_id: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    metered_stripe_meter_id: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    metered_unit_label: Mapped[Optional[str]] = mapped_column(String(50), nullable=True)

    # Current sellable price versions (plans reference versions, not raw price IDs)
    current_monthly_price_version_id: Mapped[Optional[UUID]] = mapped_column(
        UUID(as_uuid=True), ForeignKey("plan_price_versions.id", ondelete="SET NULL"), nullable=True
    )
    current_yearly_price_version_id: Mapped[Optional[UUID]] = mapped_column(
        UUID(as_uuid=True), ForeignKey("plan_price_versions.id", ondelete="SET NULL"), nullable=True
    )
    current_metered_price_version_id: Mapped[Optional[UUID]] = mapped_column(
        UUID(as_uuid=True), ForeignKey("plan_price_versions.id", ondelete="SET NULL"), nullable=True
    )

    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
    updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())


class PlanPriceVersion(Base):
    """Append-only price version history. Plans reference current version; historical pricing reconstructible."""
    __tablename__ = "plan_price_versions"

    id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid4)
    subscription_plan_id: Mapped[UUID] = mapped_column(
        UUID(as_uuid=True), ForeignKey("subscription_plans.id", ondelete="CASCADE"), nullable=False
    )
    interval: Mapped[str] = mapped_column(String(20), nullable=False)  # month, year, metered
    stripe_price_id: Mapped[str] = mapped_column(String(100), nullable=False, unique=True)
    price_minor: Mapped[int] = mapped_column(BigInteger, nullable=False)
    currency: Mapped[str] = mapped_column(String(10), nullable=False, default="usd")
    stripe_product_id: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    is_current: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
