"""
Subscription and Plan Models
"""
from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON, Enum as SQLEnum, Boolean, Numeric
from sqlalchemy.orm import relationship
import enum

from app.models.base import Base, TimestampMixin


class PlanType(enum.Enum):
    FREE = "free"
    STARTER = "starter"
    BUSINESS = "business"
    ENTERPRISE = "enterprise"
    CUSTOM = "custom"


class BillingCycle(enum.Enum):
    MONTHLY = "monthly"
    QUARTERLY = "quarterly"
    YEARLY = "yearly"


class SubscriptionStatus(enum.Enum):
    ACTIVE = "active"
    CANCELLED = "cancelled"
    EXPIRED = "expired"
    PAUSED = "paused"
    TRIAL = "trial"


class Plan(Base, TimestampMixin):
    """
    Subscription Plan Model
    """
    __tablename__ = "plans"

    id = Column(Integer, primary_key=True, index=True)

    # Plan Details
    name = Column(String(100), nullable=False)
    code = Column(String(50), unique=True, nullable=False)  # e.g., "starter", "business"
    description = Column(Text, nullable=True)
    plan_type = Column(SQLEnum(PlanType), nullable=False)

    # Pricing
    price_monthly = Column(Numeric(10, 2), default=0)
    price_quarterly = Column(Numeric(10, 2), default=0)
    price_yearly = Column(Numeric(10, 2), default=0)
    currency = Column(String(3), default="INR")

    # Features & Limits
    features = Column(JSON, default=[])

    # Chatbot Limits
    monthly_messages = Column(Integer, default=1000)
    daily_messages = Column(Integer, default=100)
    max_conversations = Column(Integer, default=100)

    # Channel Access
    channels_allowed = Column(JSON, default=["web"])  # web, whatsapp, telegram, etc.

    # Model Access
    models_allowed = Column(JSON, default=["gpt-4o-mini"])
    max_tokens_per_message = Column(Integer, default=1000)

    # Analytics Limits
    analytics_retention_days = Column(Integer, default=30)
    analytics_reports = Column(Boolean, default=False)

    # Vision Limits
    vision_requests_monthly = Column(Integer, default=0)

    # Support
    support_level = Column(String(50), default="email")  # email, chat, phone, dedicated

    # Custom Branding
    custom_branding = Column(Boolean, default=False)
    remove_watermark = Column(Boolean, default=False)

    # API Access
    api_access = Column(Boolean, default=True)
    webhook_access = Column(Boolean, default=False)

    # Team
    max_team_members = Column(Integer, default=1)

    # Status
    is_active = Column(Boolean, default=True)
    is_visible = Column(Boolean, default=True)  # Show on pricing page

    # Display Order
    display_order = Column(Integer, default=0)

    # Relationships
    subscriptions = relationship("Subscription", back_populates="plan")

    def __repr__(self):
        return f"<Plan(id={self.id}, name='{self.name}')>"


class Subscription(Base, TimestampMixin):
    """
    Client Subscription Model
    """
    __tablename__ = "subscriptions"

    id = Column(Integer, primary_key=True, index=True)
    client_id = Column(Integer, ForeignKey("clients.id"), nullable=False, index=True)
    plan_id = Column(Integer, ForeignKey("plans.id"), nullable=False)

    # Subscription Details
    status = Column(SQLEnum(SubscriptionStatus), default=SubscriptionStatus.TRIAL)
    billing_cycle = Column(SQLEnum(BillingCycle), default=BillingCycle.MONTHLY)

    # Dates
    start_date = Column(DateTime, default=datetime.utcnow)
    end_date = Column(DateTime, nullable=True)
    trial_end_date = Column(DateTime, nullable=True)
    cancelled_at = Column(DateTime, nullable=True)
    paused_at = Column(DateTime, nullable=True)

    # Billing
    amount = Column(Numeric(10, 2), nullable=False)
    currency = Column(String(3), default="INR")
    next_billing_date = Column(DateTime, nullable=True)

    # Payment Gateway
    razorpay_subscription_id = Column(String(100), nullable=True)
    stripe_subscription_id = Column(String(100), nullable=True)

    # Usage (current period)
    messages_used = Column(Integer, default=0)
    vision_requests_used = Column(Integer, default=0)

    # Auto-renew
    auto_renew = Column(Boolean, default=True)

    # Discount/Coupon
    coupon_code = Column(String(50), nullable=True)
    discount_percentage = Column(Integer, default=0)

    # Relationships
    client = relationship("Client", back_populates="subscriptions")
    plan = relationship("Plan", back_populates="subscriptions")

    def __repr__(self):
        return f"<Subscription(id={self.id}, client_id={self.client_id})>"
