# app/modules/tenancy/models/vendor_domain.py
"""
Vendor Domain Model - Maps custom domains to vendors
"""

from sqlalchemy import (
    Boolean,
    Column,
    DateTime,
    ForeignKey,
    Index,
    Integer,
    String,
    UniqueConstraint,
)
from sqlalchemy.orm import relationship

from app.core.database import Base
from models.database.base import TimestampMixin


class VendorDomain(Base, TimestampMixin):
    """
    Maps custom domains to vendors for multi-domain routing.

    Examples:
    - customdomain1.com -> Vendor 1
    - shop.mybusiness.com -> Vendor 2
    - www.customdomain1.com -> Vendor 1 (www is stripped)
    """

    __tablename__ = "vendor_domains"

    id = Column(Integer, primary_key=True, index=True)
    vendor_id = Column(
        Integer, ForeignKey("vendors.id", ondelete="CASCADE"), nullable=False
    )

    # Domain configuration
    domain = Column(String(255), nullable=False, unique=True, index=True)
    is_primary = Column(Boolean, default=False, nullable=False)
    is_active = Column(Boolean, default=True, nullable=False)

    # SSL/TLS status (for monitoring)
    ssl_status = Column(
        String(50), default="pending"
    )  # pending, active, expired, error
    ssl_verified_at = Column(DateTime(timezone=True), nullable=True)

    # DNS verification (to confirm domain ownership)
    verification_token = Column(String(100), unique=True, nullable=True)
    is_verified = Column(Boolean, default=False, nullable=False)
    verified_at = Column(DateTime(timezone=True), nullable=True)

    # Relationships
    vendor = relationship("Vendor", back_populates="domains")

    # Constraints
    __table_args__ = (
        UniqueConstraint("vendor_id", "domain", name="uq_vendor_domain"),
        Index("idx_domain_active", "domain", "is_active"),
        Index("idx_vendor_primary", "vendor_id", "is_primary"),
    )

    def __repr__(self):
        return f"<VendorDomain(domain='{self.domain}', vendor_id={self.vendor_id})>"

    @property
    def full_url(self):
        """Return full URL with https"""
        return f"https://{self.domain}"

    @classmethod
    def normalize_domain(cls, domain: str) -> str:
        """
        Normalize domain for consistent storage.

        Examples:
        - https://example.com -> example.com
        - www.example.com -> example.com
        - EXAMPLE.COM -> example.com
        """
        # Remove protocol
        domain = domain.replace("https://", "").replace("http://", "")  # noqa: SEC-034

        # Remove trailing slash
        domain = domain.rstrip("/")

        # Remove www prefix (optional - depends on your preference)
        # if domain.startswith("www."):
        #     domain = domain[4:]

        # Convert to lowercase
        domain = domain.lower()

        return domain


__all__ = ["VendorDomain"]
