"""Phase 14: SSO / SAML 2.0 configuration model."""

import uuid
from datetime import datetime

from sqlalchemy import Boolean, Column, DateTime, String, Text
from sqlalchemy.dialects.postgresql import UUID

from app.database import Base


class SsoConfig(Base):
    """
    SAML 2.0 Identity Provider configuration.

    Exactly one row is expected (use upsert).  The SP metadata endpoint
    reads from this row to generate XML for IdP registration.
    """

    __tablename__ = "sso_configs"

    id           = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    is_enabled   = Column(Boolean, nullable=False, default=False)
    provider_name = Column(String(200), nullable=True)  # e.g., "Okta", "Azure AD"

    # ── Service Provider (Aegis) settings ────────────────────────────────────
    sp_entity_id  = Column(String(500), nullable=True)   # e.g., https://aegis.co/api/v1/sso/metadata
    sp_acs_url    = Column(String(500), nullable=True)   # Assertion Consumer Service URL
    sp_slo_url    = Column(String(500), nullable=True)   # Single Logout URL (optional)
    sp_certificate = Column(Text, nullable=True)         # SP public cert for signed requests
    sp_private_key = Column(Text, nullable=True)         # SP private key (stored encrypted in future)

    # ── Identity Provider settings ────────────────────────────────────────────
    idp_entity_id  = Column(String(500), nullable=True)
    idp_sso_url    = Column(String(500), nullable=True)  # IdP redirect/POST binding URL
    idp_slo_url    = Column(String(500), nullable=True)  # IdP SLO URL
    idp_certificate = Column(Text, nullable=True)        # IdP X.509 cert for response validation

    # ── Attribute mapping ─────────────────────────────────────────────────────
    # SAML attribute name → Aegis field
    attr_email    = Column(String(200), nullable=True, default="email")
    attr_username = Column(String(200), nullable=True, default="username")
    attr_role     = Column(String(200), nullable=True, default="role")
    default_role  = Column(String(50),  nullable=True, default="viewer")
    auto_provision = Column(Boolean, nullable=False, default=True)  # create user on first login

    # ── Meta ─────────────────────────────────────────────────────────────────
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
