/**
 * Scanner automático de envios de email e mensagens no código
 * Identifica todos os locais onde emails são enviados para gerar templates
 */

import { Doc } from '../_generated/dataModel';

export interface EmailSendLocation {
	arquivo: string;
	funcao: string;
	tipo: 'enfileirarEmail' | 'enviarEmailComTemplate' | 'enviarMensagem' | 'html_inline';
	linha?: number;
	contexto?: string;
	assunto?: string;
	corpo?: string;
	templateCodigo?: string;
	variaveis?: string[];
}

/**
 * Lista de locais conhecidos onde emails são enviados
 * Este é um mapeamento manual baseado na análise do código
 */
export const LOCAIS_ENVIO_EMAIL: EmailSendLocation[] = [
	// Chamados
	{
		arquivo: 'packages/backend/convex/chamados.ts',
		funcao: 'registrarNotificacoes',
		tipo: 'enfileirarEmail',
		contexto: 'Notificação ao solicitante quando chamado é criado/atualizado',
		assunto: 'Chamado {{numeroTicket}} - {{titulo}}',
		corpo: '{{mensagem}}\n\n---\nCentral de Chamados SGSE - Sistema de Gerenciamento de Secretaria',
		variaveis: ['numeroTicket', 'titulo', 'mensagem']
	},
	{
		arquivo: 'packages/backend/convex/chamados.ts',
		funcao: 'registrarNotificacoes',
		tipo: 'enfileirarEmail',
		contexto: 'Notificação ao responsável quando chamado é atualizado',
		assunto: 'Chamado {{numeroTicket}} - {{titulo}}',
		corpo: '{{mensagem}}\n\n---\nCentral de Chamados SGSE - Sistema de Gerenciamento de Secretaria',
		variaveis: ['numeroTicket', 'titulo', 'mensagem']
	},

	// Ausências
	{
		arquivo: 'packages/backend/convex/ausencias.ts',
		funcao: 'solicitar',
		tipo: 'enfileirarEmail',
		contexto: 'Notificação ao gestor quando funcionário solicita ausência',
		assunto: 'Nova Solicitação de Ausência - {{funcionarioNome}}',
		corpo:
			'Olá {{gestorNome}},\n\nO funcionário <strong>{{funcionarioNome}}</strong> solicitou uma ausência:\n\n<ul><li><strong>Período:</strong> {{dataInicio}} até {{dataFim}}</li><li><strong>Motivo:</strong> {{motivo}}</li></ul>\n\nPor favor, acesse o sistema para aprovar ou reprovar esta solicitação.',
		variaveis: ['gestorNome', 'funcionarioNome', 'dataInicio', 'dataFim', 'motivo']
	},
	{
		arquivo: 'packages/backend/convex/ausencias.ts',
		funcao: 'aprovar',
		tipo: 'enfileirarEmail',
		contexto: 'Notificação ao funcionário quando ausência é aprovada',
		assunto: 'Solicitação de Ausência Aprovada',
		corpo:
			'Olá {{funcionarioNome}},\n\nSua solicitação de ausência foi <strong>aprovada</strong> pelo gestor {{gestorNome}}:\n\n<ul><li><strong>Período:</strong> {{dataInicio}} até {{dataFim}}</li><li><strong>Motivo:</strong> {{motivo}}</li></ul>',
		variaveis: ['funcionarioNome', 'gestorNome', 'dataInicio', 'dataFim', 'motivo']
	},
	{
		arquivo: 'packages/backend/convex/ausencias.ts',
		funcao: 'reprovar',
		tipo: 'enfileirarEmail',
		contexto: 'Notificação ao funcionário quando ausência é reprovada',
		assunto: 'Solicitação de Ausência Reprovada',
		corpo:
			'Olá {{funcionarioNome}},\n\nSua solicitação de ausência foi <strong>reprovada</strong> pelo gestor {{gestorNome}}:\n\n<ul><li><strong>Período:</strong> {{dataInicio}} até {{dataFim}}</li><li><strong>Motivo:</strong> {{motivo}}</li><li><strong>Motivo da Reprovação:</strong> {{motivoReprovacao}}</li></ul>',
		variaveis: [
			'funcionarioNome',
			'gestorNome',
			'dataInicio',
			'dataFim',
			'motivo',
			'motivoReprovacao'
		]
	},

	// Chat
	{
		arquivo: 'packages/backend/convex/chat.ts',
		funcao: 'enviarMensagem',
		tipo: 'enviarEmailComTemplate',
		contexto: 'Email quando usuário recebe nova mensagem no chat (usuário offline)',
		templateCodigo: 'chat_mensagem',
		variaveis: ['remetente', 'mensagem', 'conversaId', 'urlSistema']
	},
	{
		arquivo: 'packages/backend/convex/chat.ts',
		funcao: 'enviarMensagem',
		tipo: 'enviarEmailComTemplate',
		contexto: 'Email quando usuário é mencionado no chat (usuário offline)',
		templateCodigo: 'chat_mencao',
		variaveis: ['remetente', 'mensagem', 'conversaId', 'urlSistema']
	},

	// Painel de Notificações
	{
		arquivo: 'apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte',
		funcao: 'enviarNotificacao',
		tipo: 'enfileirarEmail',
		contexto: 'Envio manual de notificação via painel de TI',
		assunto: 'Notificação do Sistema',
		corpo: '{{mensagemPersonalizada}}',
		variaveis: ['mensagemPersonalizada']
	},
	{
		arquivo: 'apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte',
		funcao: 'enviarNotificacao',
		tipo: 'enviarEmailComTemplate',
		contexto: 'Envio manual de notificação usando template via painel de TI',
		templateCodigo: '{{templateCodigo}}',
		variaveis: ['nome', 'matricula']
	}
];

/**
 * Sugestões de templates baseadas nos locais de envio encontrados
 */
export interface TemplateSuggestion {
	codigo: string;
	nome: string;
	titulo: string;
	corpo: string;
	categoria: 'email' | 'chat' | 'ambos';
	variaveis: string[];
	tags: string[];
	origem: string;
}

/**
 * Gerar sugestões de templates baseadas nos locais de envio
 */
export function gerarSugestoesTemplates(): TemplateSuggestion[] {
	const sugestoes: TemplateSuggestion[] = [];

	// Template para ausência solicitada
	sugestoes.push({
		codigo: 'ausencia_solicitada',
		nome: 'Ausência Solicitada',
		titulo: 'Nova Solicitação de Ausência - {{funcionarioNome}}',
		corpo:
			'Olá {{gestorNome}},\n\nO funcionário <strong>{{funcionarioNome}}</strong> solicitou uma ausência:\n\n<ul><li><strong>Período:</strong> {{dataInicio}} até {{dataFim}}</li><li><strong>Motivo:</strong> {{motivo}}</li></ul>\n\nPor favor, acesse o sistema para aprovar ou reprovar esta solicitação.',
		categoria: 'email',
		variaveis: ['gestorNome', 'funcionarioNome', 'dataInicio', 'dataFim', 'motivo'],
		tags: ['ausencia', 'solicitacao', 'gestao'],
		origem: 'ausencias.ts - solicitar'
	});

	// Template para ausência aprovada
	sugestoes.push({
		codigo: 'ausencia_aprovada',
		nome: 'Ausência Aprovada',
		titulo: 'Solicitação de Ausência Aprovada',
		corpo:
			'Olá {{funcionarioNome}},\n\nSua solicitação de ausência foi <strong>aprovada</strong> pelo gestor {{gestorNome}}:\n\n<ul><li><strong>Período:</strong> {{dataInicio}} até {{dataFim}}</li><li><strong>Motivo:</strong> {{motivo}}</li></ul>',
		categoria: 'email',
		variaveis: ['funcionarioNome', 'gestorNome', 'dataInicio', 'dataFim', 'motivo'],
		tags: ['ausencia', 'aprovacao', 'gestao'],
		origem: 'ausencias.ts - aprovar'
	});

	// Template para ausência reprovada
	sugestoes.push({
		codigo: 'ausencia_reprovada',
		nome: 'Ausência Reprovada',
		titulo: 'Solicitação de Ausência Reprovada',
		corpo:
			'Olá {{funcionarioNome}},\n\nSua solicitação de ausência foi <strong>reprovada</strong> pelo gestor {{gestorNome}}:\n\n<ul><li><strong>Período:</strong> {{dataInicio}} até {{dataFim}}</li><li><strong>Motivo:</strong> {{motivo}}</li><li><strong>Motivo da Reprovação:</strong> {{motivoReprovacao}}</li></ul>',
		categoria: 'email',
		variaveis: [
			'funcionarioNome',
			'gestorNome',
			'dataInicio',
			'dataFim',
			'motivo',
			'motivoReprovacao'
		],
		tags: ['ausencia', 'reprovacao', 'gestao'],
		origem: 'ausencias.ts - reprovar'
	});

	// Template genérico para notificações de chamados
	sugestoes.push({
		codigo: 'chamado_notificacao',
		nome: 'Notificação de Chamado',
		titulo: 'Chamado {{numeroTicket}} - {{titulo}}',
		corpo: '{{mensagem}}\n\n---\nCentral de Chamados SGSE - Sistema de Gerenciamento de Secretaria',
		categoria: 'email',
		variaveis: ['numeroTicket', 'titulo', 'mensagem'],
		tags: ['chamado', 'notificacao', 'suporte'],
		origem: 'chamados.ts - registrarNotificacoes'
	});

	return sugestoes;
}

/**
 * Obter todos os locais de envio de email
 */
export function obterLocaisEnvio(): EmailSendLocation[] {
	return LOCAIS_ENVIO_EMAIL;
}
