"""Schemas für Reseller-Selbstverwaltung und SUPER_ADMIN-Mandantenübersicht.

Wichtig (DSGVO): Reseller sehen ausschließlich Firmen-Stammdaten und Kennzahlen
(z.B. Nutzeranzahl) – KEINE personenbezogenen Zeit-/Abwesenheitsdaten.
"""
import uuid
from datetime import datetime

from pydantic import BaseModel, EmailStr, Field


class TenantOut(BaseModel):
    """Eine Firma als Mandant – für Reseller- und SUPER_ADMIN-Übersicht."""
    model_config = {"from_attributes": True}

    id: uuid.UUID
    name: str
    slug: str
    plan: str
    is_active: bool
    country: str
    reseller_id: uuid.UUID | None = None
    reseller_name: str | None = None
    user_count: int = 0
    active_user_count: int = 0
    admin_email: str | None = None
    created_at: datetime | None = None
    # Nur bei Anlage ohne E-Mail befüllt: einmalig anzuzeigende Zugangsdaten
    # (Login-Kennung = admin_email, Passwort hier). Sonst None.
    initial_password: str | None = None


class TenantCreate(BaseModel):
    """Neue Firma anlegen (durch Reseller oder SUPER_ADMIN).

    Es wird automatisch ein erster COMPANY_ADMIN angelegt. Mit admin_email wird
    eine Einladung verschickt; ohne admin_email wird eine interne Login-Kennung
    plus Temporär-Passwort erzeugt und einmalig zurückgegeben (kein Mailversand).
    """
    name: str = Field(min_length=2, max_length=255)
    country: str = Field(default="DE", max_length=10)
    plan: str = Field(default="trial", max_length=50)
    admin_email: EmailStr | None = None
    admin_first_name: str = Field(min_length=1, max_length=100)
    admin_last_name: str = Field(min_length=1, max_length=100)


class TenantUpdate(BaseModel):
    name: str | None = Field(None, min_length=2, max_length=255)
    plan: str | None = Field(None, max_length=50)
    is_active: bool | None = None


class TenantAssignReseller(BaseModel):
    """SUPER_ADMIN: Firma einem Reseller zuordnen (oder lösen mit null)."""
    reseller_id: uuid.UUID | None = None


class ResellerOut(BaseModel):
    model_config = {"from_attributes": True}

    id: uuid.UUID
    email: str
    first_name: str
    last_name: str
    is_active: bool
    created_at: datetime | None = None
    company_count: int = 0
    # Nur bei Anlage ohne E-Mail befüllt: einmalig anzuzeigendes Temporär-Passwort.
    initial_password: str | None = None


class ResellerCreate(BaseModel):
    email: EmailStr | None = None
    first_name: str = Field(min_length=1, max_length=100)
    last_name: str = Field(min_length=1, max_length=100)
