"""
Microsoft 365 tenant model for tracking M365 tenants.

M365 tenants represent Microsoft 365 tenant configurations for clients
including tenant IDs, domains, and CIPP integration.
"""

from typing import Optional

from sqlalchemy import CHAR, ForeignKey, Index, String, Text
from sqlalchemy.orm import Mapped, mapped_column

from .base import Base, TimestampMixin, UUIDMixin


class M365Tenant(Base, UUIDMixin, TimestampMixin):
    """
    Microsoft 365 tenant model for tracking M365 configurations.

    Tracks Microsoft 365 tenant information including tenant IDs,
    domain names, admin contacts, and CIPP portal integration.

    Attributes:
        client_id: Reference to the client
        tenant_id: Microsoft tenant ID (UUID)
        tenant_name: Tenant name (e.g., "dataforth.com")
        default_domain: Default domain (e.g., "dataforthcorp.onmicrosoft.com")
        admin_email: Administrator email address
        cipp_name: Name in CIPP portal
        notes: Additional notes
    """

    __tablename__ = "m365_tenants"

    # Foreign keys
    client_id: Mapped[Optional[str]] = mapped_column(
        CHAR(36),
        ForeignKey("clients.id", ondelete="CASCADE"),
        doc="Reference to the client"
    )

    # Tenant identification
    tenant_id: Mapped[str] = mapped_column(
        CHAR(36),
        nullable=False,
        unique=True,
        doc="Microsoft tenant ID (UUID)"
    )

    tenant_name: Mapped[Optional[str]] = mapped_column(
        String(255),
        doc="Tenant name (e.g., 'dataforth.com')"
    )

    default_domain: Mapped[Optional[str]] = mapped_column(
        String(255),
        doc="Default domain (e.g., 'dataforthcorp.onmicrosoft.com')"
    )

    # Contact information
    admin_email: Mapped[Optional[str]] = mapped_column(
        String(255),
        doc="Administrator email address"
    )

    # CIPP integration
    cipp_name: Mapped[Optional[str]] = mapped_column(
        String(255),
        doc="Name in CIPP portal"
    )

    # Notes
    notes: Mapped[Optional[str]] = mapped_column(
        Text,
        doc="Additional notes"
    )

    # Indexes
    __table_args__ = (
        Index("idx_m365_client", "client_id"),
        Index("idx_m365_tenant_id", "tenant_id"),
    )

    def __repr__(self) -> str:
        """String representation of the M365 tenant."""
        return f"<M365Tenant(tenant_name='{self.tenant_name}', tenant_id='{self.tenant_id}')>"
