"""Seed para coleção usuario-empresa-perfis com relacionamentos básicos."""

from __future__ import annotations

import asyncio
import sys
from pathlib import Path
from typing import Any, Dict

from appwrite.exception import AppwriteException

# Garantir que o diretório src esteja no sys.path quando o script for executado diretamente
ROOT_DIR = Path(__file__).resolve().parents[1]
if str(ROOT_DIR) not in sys.path:
    sys.path.append(str(ROOT_DIR))

from src.core.appwrite_client import get_appwrite_clients  # noqa: E402
from src.core.auth import get_password_hash  # noqa: E402
from src.core.config import get_settings  # noqa: E402


async def _run_io(fn, *args, **kwargs):
    return await asyncio.to_thread(fn, *args, **kwargs)


async def _upsert_document(databases, database_id: str, collection_id: str, document_id: str, data: Dict[str, Any]) -> str:
    try:
        await _run_io(databases.get_document, database_id, collection_id, document_id)
    except AppwriteException as exc:
        if exc.code != 404:
            raise
        await _run_io(databases.create_document, database_id, collection_id, document_id, data)
    else:
        await _run_io(databases.update_document, database_id, collection_id, document_id, data)
    return document_id


async def _ensure_unique_index(databases, database_id: str, collection_id: str) -> None:
    try:
        await _run_io(
            databases.create_index,
            database_id,
            collection_id,
            key="unique_usuario_empresa_perfis",
            type="unique",
            attributes=["usuarios", "empresas-dados", "usuario-perfis"],
        )
        print("✔️ Índice único criado: unique_usuario_empresa_perfis")
    except AppwriteException as exc:
        if exc.code == 409:
            print("ℹ️ Índice único já existia: unique_usuario_empresa_perfis")
            return
        raise


async def _assert_unique(databases, database_id: str, collection_id: str, data: Dict[str, Any]) -> None:
    try:
        await _run_io(databases.create_document, database_id, collection_id, "unique()", data)
    except AppwriteException as exc:
        if exc.code == 409:
            print("✔️ Índice único impediu duplicidade conforme esperado.")
            return
        raise
    else:  # pragma: no cover - proteção em caso de comportamento inesperado
        raise RuntimeError("Índice único não impediu duplicidade para usuario-empresa-perfis.")


async def seed() -> None:
    settings = get_settings()
    _, databases = get_appwrite_clients()

    await _ensure_unique_index(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_usuario_empresa_perfis_id,
    )

    usuario_id = await _upsert_document(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_usuarios_id,
        "seed-usuario-a",
        {
            "identificador": "seed.user@saveinmed.com",
            "senha": get_password_hash("Seed123!"),
            "ativo": True,
            "superadmin": False,
        },
    )

    empresa_id = await _upsert_document(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_empresas_id,
        "seed-empresa-x",
        {
            "cnpj": "00000000000191",
            "razao-social": "Empresa Semente LTDA",
            "nome-fantasia": "Empresa Seed",
        },
    )

    perfil_admin_id = await _upsert_document(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_usuarios_perfil_id,
        "seed-perfil-admin",
        {"codigo": "admin", "nome": "Administrador"},
    )

    perfil_colaborador_id = await _upsert_document(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_usuarios_perfil_id,
        "seed-perfil-colaborador",
        {"codigo": "colaborador", "nome": "Colaborador"},
    )

    vinculo_admin = {
        "usuarios": usuario_id,
        "empresas-dados": empresa_id,
        "usuario-perfis": perfil_admin_id,
    }
    vinculo_colaborador = {
        "usuarios": usuario_id,
        "empresas-dados": empresa_id,
        "usuario-perfis": perfil_colaborador_id,
    }

    await _upsert_document(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_usuario_empresa_perfis_id,
        "seed-vinculo-admin",
        vinculo_admin,
    )

    await _upsert_document(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_usuario_empresa_perfis_id,
        "seed-vinculo-colaborador",
        vinculo_colaborador,
    )

    await _assert_unique(
        databases,
        settings.appwrite_database_id,
        settings.appwrite_collection_usuario_empresa_perfis_id,
        vinculo_admin,
    )

    print(
        "Seed concluído. Usuário seed-usuario-a vinculado à empresa seed-empresa-x "
        "com perfis admin e colaborador."
    )


if __name__ == "__main__":
    asyncio.run(seed())
