"""Restaurant model.

`restaurant` is a domain table owned by Alembic. It carries a 1:1 FK to the
Better Auth `team` table via `team_id`: every restaurant has exactly one
shadow team that BA's organization plugin uses for membership semantics.

The previous `owner_id` (FK to user) and `subscription_plan` columns are
removed. Subscription plan now lives on `organization.metadata.plan`
(BA-managed) and access is via `member.role` + optional `teamMember` rows.
"""

import uuid
from typing import Any, cast

from sqlalchemy import Column
from sqlalchemy.dialects.postgresql import JSONB
from sqlmodel import Field, SQLModel

DEFAULT_NOTIFICATION_PREFERENCES: dict[str, Any] = {
    "in_app_enabled": True,
    "email_enabled": False,
    "events": {
        "reservation_created": True,
        "reservation_cancelled": True,
        "reservation_approved": True,
        "order_created": True,
        "order_status_changed": True,
        "order_cancelled": True,
    },
}


def _deep_merge(base: dict[str, Any], override: dict[str, Any]) -> None:
    for key, value in override.items():
        if key in base and isinstance(base[key], dict) and isinstance(value, dict):
            _deep_merge(base[key], value)
        else:
            base[key] = value


def get_notification_preferences(settings: dict[str, Any] | None) -> dict[str, Any]:
    merged = dict(DEFAULT_NOTIFICATION_PREFERENCES)
    merged["events"] = dict(DEFAULT_NOTIFICATION_PREFERENCES["events"])

    raw = (settings or {}).get("notification_preferences")
    if isinstance(raw, dict):
        _deep_merge(merged, raw)

    return merged


class RestaurantBase(SQLModel):
    name: str = Field(nullable=False)
    slug: str = Field(unique=True, index=True, nullable=False)
    phone: str | None = Field(default=None)
    timezone: str = Field(default="Europe/Brussels")


class Restaurant(RestaurantBase, table=True):
    __tablename__ = cast(Any, "restaurant")

    id: str = Field(
        default_factory=lambda: str(uuid.uuid4()),
        primary_key=True,
    )
    team_id: str = Field(
        foreign_key="team.id",
        unique=True,
        nullable=False,
        index=True,
    )
    settings: dict[str, Any] | None = Field(
        default=None,
        sa_column=Column(JSONB),
    )


class RestaurantCreate(RestaurantBase):
    pass


class RestaurantRead(RestaurantBase):
    id: str
    team_id: str
    settings: dict[str, Any] | None = None


class RestaurantPatch(SQLModel):
    """Partial update schema — all fields optional."""

    name: str | None = None
    slug: str | None = None
    phone: str | None = None
    timezone: str | None = None
    # Extra fields stored in settings JSONB (flat keys)
    email: str | None = None
    address_street: str | None = None
    address_city: str | None = None
    address_postcode: str | None = None
    address_country: str | None = None
    min_advance_hours: int | None = None
    max_party_size: int | None = None
    max_advance_days: int | None = None
    cancellation_policy: str | None = None
    takeaway_enabled: bool | None = None
    delivery_radius_km: float | None = None
    min_order_amount: float | None = None
    in_service_mode: str | None = None
    in_service_duration_minutes: int | None = None
    reservation_mode: str | None = None  # Reservation approval mode: "auto" or "manual"
    default_language: str | None = None  # Default UI language for public pages: "en", "nl", "fr"
    dish_chooser_enabled: bool | None = None
    dish_chooser_min_party_size: int | None = Field(default=None, ge=2, le=20)
    dish_chooser_max_dishes: int | None = Field(default=None, ge=1, le=50)
    dish_chooser_from_menu: bool | None = None
    # Nested settings JSONB deep-merge (e.g. agents, channels sub-objects)
    settings: dict[str, Any] | None = None
