/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/services/DocumentTemplates.service.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
import { supabase } from '@/lib/supabase/client';

import { tenantDb } from '@/lib/supabase/tenantClient';
// ── Helpers ──────────────────────────────────────────────────

async function getOwnerId() {
    const { data, error } = await supabase.auth.getUser();
    if (error) throw error;
    const uid = data?.user?.id;
    if (!uid) throw new Error('Sessão inválida.');
    return uid;
}

async function getActiveTenantId(uid) {
    const { data, error } = await supabase
        .from('tenant_members')
        .select('tenant_id')
        .eq('user_id', uid)
        .eq('status', 'active')
        .order('created_at', { ascending: false })
        .limit(1)
        .single();
    if (error) throw error;
    if (!data?.tenant_id) throw new Error('Tenant não encontrado.');
    return data.tenant_id;
}

// ── Variaveis disponíveis ───────────────────────────────────

/**
 * Variaveis que podem ser usadas nos templates.
 * - key: chave usada em {{variavel}} no HTML do template
 * - label: rótulo amigável (pt-BR)
 * - grupo: agrupamento visual no editor
 * - source: descrição de ONDE o dado é cadastrado (pra exibir como
 *   hint no dialog "Gerar documento" quando o campo vier vazio).
 *   É só texto explicativo — o map real de carregamento vive em
 *   DocumentGenerate.service.js (loadPatientData / loadTherapistData /
 *   loadClinicData / loadSessionData).
 */
export const TEMPLATE_VARIABLES = [
    // Paciente — fonte: tabela patients
    { key: 'paciente_nome',             label: 'Nome do paciente',            grupo: 'Paciente',  source: 'Paciente → nome completo' },
    { key: 'paciente_nome_social',      label: 'Nome social',                 grupo: 'Paciente',  source: 'Paciente → nome social' },
    { key: 'paciente_cpf',              label: 'CPF do paciente',             grupo: 'Paciente',  source: 'Paciente → CPF' },
    { key: 'paciente_data_nascimento',  label: 'Data de nascimento',          grupo: 'Paciente',  source: 'Paciente → data de nascimento' },
    { key: 'paciente_telefone',         label: 'Telefone do paciente',        grupo: 'Paciente',  source: 'Paciente → telefone' },
    { key: 'paciente_email',            label: 'E-mail do paciente',          grupo: 'Paciente',  source: 'Paciente → e-mail principal' },
    { key: 'paciente_endereco',         label: 'Endereço do paciente',        grupo: 'Paciente',  source: 'Paciente → endereço/número/bairro/cidade/UF' },

    // Sessao — fonte: agenda_eventos (só preenche se houver sessao vinculada)
    { key: 'data_sessao',  label: 'Data da sessão',               grupo: 'Sessão',  source: 'Agenda → sessão selecionada (data de início)' },
    { key: 'hora_inicio',  label: 'Hora início',                  grupo: 'Sessão',  source: 'Agenda → sessão selecionada (hora de início)' },
    { key: 'hora_fim',     label: 'Hora fim',                     grupo: 'Sessão',  source: 'Agenda → sessão selecionada (hora de fim)' },
    { key: 'modalidade',   label: 'Modalidade (presencial/online)', grupo: 'Sessão', source: 'Agenda → sessão selecionada (modalidade)' },

    // Terapeuta — fonte: profiles (usuário logado) + auth.users
    { key: 'terapeuta_nome',            label: 'Nome do terapeuta',                        grupo: 'Terapeuta',  source: 'Perfil → nome completo' },
    { key: 'terapeuta_registro',        label: 'Registro profissional (ex: CRP 12345/SP)', grupo: 'Terapeuta',  source: 'Perfil → Registro Profissional (tipo + número/UF)' },
    { key: 'terapeuta_registro_tipo',   label: 'Tipo do registro (CRP/CRM/CRFa…)',         grupo: 'Terapeuta',  source: 'Perfil → Registro Profissional → tipo' },
    { key: 'terapeuta_registro_numero', label: 'Número do registro',                       grupo: 'Terapeuta',  source: 'Perfil → Registro Profissional → número' },
    { key: 'terapeuta_registro_uf',     label: 'UF do registro',                           grupo: 'Terapeuta',  source: 'Perfil → Registro Profissional → UF' },
    { key: 'terapeuta_crp',             label: 'CRP (legacy — prefira terapeuta_registro)', grupo: 'Terapeuta', source: 'Perfil → só preenche se o tipo for "CRP"' },
    { key: 'terapeuta_email',           label: 'E-mail do terapeuta',                      grupo: 'Terapeuta',  source: 'Conta → e-mail de login' },
    { key: 'terapeuta_telefone',        label: 'Telefone do terapeuta',                    grupo: 'Terapeuta',  source: 'Perfil → telefone' },

    // Clinica — fonte: tabela tenants (clinica ativa do usuário)
    { key: 'clinica_nome',     label: 'Nome da clínica',     grupo: 'Clínica',  source: 'Configurações → Clínica → nome' },
    { key: 'clinica_endereco', label: 'Endereço da clínica', grupo: 'Clínica',  source: 'Configurações → Clínica → logradouro/número/bairro/cidade/UF' },
    { key: 'clinica_telefone', label: 'Telefone da clínica', grupo: 'Clínica',  source: 'Configurações → Clínica → telefone' },
    { key: 'clinica_cnpj',     label: 'CNPJ da clínica',     grupo: 'Clínica',  source: 'Configurações → Clínica → CPF/CNPJ (preenche só se tiver 14 dígitos)' },

    // Financeiro — fonte: sessão OU extras (passados pelo chamador)
    { key: 'valor',           label: 'Valor (R$)',          grupo: 'Financeiro',  source: 'Sessão (preço) ou informe manualmente' },
    { key: 'valor_extenso',   label: 'Valor por extenso',   grupo: 'Financeiro',  source: 'Calculado a partir do valor' },
    { key: 'forma_pagamento', label: 'Forma de pagamento',  grupo: 'Financeiro',  source: 'Informe manualmente (PIX, dinheiro, cartão, etc)' },

    // Datas — fonte: clock do sistema / endereço da clínica
    { key: 'data_atual',         label: 'Data atual',           grupo: 'Datas',  source: 'Hoje (preenchido automaticamente)' },
    { key: 'data_atual_extenso', label: 'Data atual por extenso', grupo: 'Datas', source: 'Hoje (preenchido automaticamente)' },
    { key: 'cidade_estado',      label: 'Cidade/UF',            grupo: 'Datas',  source: 'Configurações → Clínica → cidade/UF (últimos 2 elementos do endereço)' }
];

// ── List ────────────────────────────────────────────────────

/**
 * Lista templates disponíveis: globais + do tenant do usuario.
 */
export async function listTemplates() {
    const ownerId = await getOwnerId();
    const tenantId = await getActiveTenantId(ownerId);

    const { data, error } = await tenantDb().from('document_templates')
        .select('*')
        .eq('ativo', true)
        .order('nome_template', { ascending: true });

    if (error) throw error;
    return data || [];
}

/**
 * Lista todos os templates (incluindo inativos) — para pagina de gestao.
 */
export async function listAllTemplates() {
    const ownerId = await getOwnerId();
    const tenantId = await getActiveTenantId(ownerId);

    const { data, error } = await tenantDb().from('document_templates')
        .select('*')
        .order('is_global', { ascending: false })
        .order('nome_template', { ascending: true });

    if (error) throw error;
    return data || [];
}

// ── Get one ─────────────────────────────────────────────────

export async function getTemplate(id) {
    const { data, error } = await tenantDb().from('document_templates')
        .select('*')
        .eq('id', id)
        .single();

    if (error) throw error;
    return data;
}

// ── Create ──────────────────────────────────────────────────

export async function createTemplate(payload) {
    const ownerId = await getOwnerId();
    const tenantId = await getActiveTenantId(ownerId);

    const nome = String(payload.nome_template || '').trim();
    if (!nome) throw new Error('Nome do template é obrigatório.');

    const row = {
        owner_id: ownerId,
        nome_template: nome,
        tipo: payload.tipo || 'outro',
        descricao: payload.descricao || null,
        corpo_html: payload.corpo_html || '',
        cabecalho_html: payload.cabecalho_html || null,
        rodape_html: payload.rodape_html || null,
        variaveis: payload.variaveis || [],
        logo_url: payload.logo_url || null,
        is_global: false,
        ativo: true
    };

    const { data, error } = await tenantDb().from('document_templates')
        .insert(row)
        .select('*')
        .single();

    if (error) throw error;
    return data;
}

// ── Update ──────────────────────────────────────────────────

export async function updateTemplate(id, payload) {
    const ownerId = await getOwnerId();
    if (!id) throw new Error('ID inválido.');

    const row = {};
    if (payload.nome_template !== undefined) row.nome_template = String(payload.nome_template).trim();
    if (payload.tipo !== undefined) row.tipo = payload.tipo;
    if (payload.descricao !== undefined) row.descricao = payload.descricao;
    if (payload.corpo_html !== undefined) row.corpo_html = payload.corpo_html;
    if (payload.cabecalho_html !== undefined) row.cabecalho_html = payload.cabecalho_html;
    if (payload.rodape_html !== undefined) row.rodape_html = payload.rodape_html;
    if (payload.variaveis !== undefined) row.variaveis = payload.variaveis;
    if (payload.logo_url !== undefined) row.logo_url = payload.logo_url;
    if (payload.ativo !== undefined) row.ativo = payload.ativo;

    row.updated_at = new Date().toISOString();

    const { data, error } = await tenantDb().from('document_templates')
        .update(row)
        .eq('id', id)
        .eq('owner_id', ownerId)
        .select('*')
        .single();

    if (error) throw error;
    return data;
}

// ── Delete (soft) ───────────────────────────────────────────

export async function deleteTemplate(id) {
    const ownerId = await getOwnerId();
    if (!id) throw new Error('ID inválido.');

    const { error } = await tenantDb().from('document_templates')
        .update({ ativo: false, updated_at: new Date().toISOString() })
        .eq('id', id)
        .eq('owner_id', ownerId);

    if (error) throw error;
    return true;
}

// ── Duplicate ───────────────────────────────────────────────

export async function duplicateTemplate(id) {
    const original = await getTemplate(id);
    if (!original) throw new Error('Template não encontrado.');

    return createTemplate({
        nome_template: original.nome_template + ' (cópia)',
        tipo: original.tipo,
        descricao: original.descricao,
        corpo_html: original.corpo_html,
        cabecalho_html: original.cabecalho_html,
        rodape_html: original.rodape_html,
        variaveis: original.variaveis,
        logo_url: original.logo_url
    });
}

// ── Extrair variaveis do HTML ───────────────────────────────

/**
 * Extrai variaveis {{nome}} do corpo HTML de um template.
 */
export function extractVariablesFromHtml(html) {
    const matches = String(html || '').match(/\{\{(\w+)\}\}/g) || [];
    const keys = matches.map(m => m.replace(/\{\{|\}\}/g, ''));
    return [...new Set(keys)];
}
