import { defineTable } from 'convex/server';
import { Infer, v } from 'convex/values';

export const simboloTipo = v.union(
	v.literal('cargo_comissionado'),
	v.literal('funcao_gratificada')
);
export type SimboloTipo = Infer<typeof simboloTipo>;

export const funcionariosTables = {
	simbolos: defineTable({
		nome: v.string(),
		tipo: simboloTipo,
		descricao: v.string(),
		vencValor: v.string(),
		repValor: v.string(),
		valor: v.string()
	}),

	funcionarios: defineTable({
		// Campos obrigatórios existentes
		nome: v.string(),
		nascimento: v.string(),
		rg: v.string(),
		cpf: v.string(),
		endereco: v.string(),
		cep: v.string(),
		cidade: v.string(),
		uf: v.string(),
		telefone: v.string(),
		email: v.string(),
		matricula: v.optional(v.string()),
		admissaoData: v.optional(v.string()),
		desligamentoData: v.optional(v.string()),
		simboloId: v.id('simbolos'),
		simboloTipo: simboloTipo,
		gestorId: v.optional(v.id('usuarios')),
		statusFerias: v.optional(v.union(v.literal('ativo'), v.literal('em_ferias'))),

		// Regime de trabalho (para cálculo correto de férias)
		regimeTrabalho: v.optional(
			v.union(
				v.literal('clt'), // CLT - Consolidação das Leis do Trabalho
				v.literal('estatutario_pe'), // Servidor Público Estadual de Pernambuco
				v.literal('estatutario_federal'), // Servidor Público Federal
				v.literal('estatutario_municipal') // Servidor Público Municipal
			)
		),

		// Dados Pessoais Adicionais (opcionais)
		nomePai: v.optional(v.string()),
		nomeMae: v.optional(v.string()),
		naturalidade: v.optional(v.string()),
		naturalidadeUF: v.optional(v.string()),
		sexo: v.optional(v.union(v.literal('masculino'), v.literal('feminino'), v.literal('outro'))),
		estadoCivil: v.optional(
			v.union(
				v.literal('solteiro'),
				v.literal('casado'),
				v.literal('divorciado'),
				v.literal('viuvo'),
				v.literal('uniao_estavel')
			)
		),
		nacionalidade: v.optional(v.string()),

		// Documentos Pessoais
		rgOrgaoExpedidor: v.optional(v.string()),
		rgDataEmissao: v.optional(v.string()),
		carteiraProfissionalNumero: v.optional(v.string()),
		carteiraProfissionalSerie: v.optional(v.string()),
		carteiraProfissionalDataEmissao: v.optional(v.string()),
		reservistaNumero: v.optional(v.string()),
		reservistaSerie: v.optional(v.string()),
		tituloEleitorNumero: v.optional(v.string()),
		tituloEleitorZona: v.optional(v.string()),
		tituloEleitorSecao: v.optional(v.string()),
		pisNumero: v.optional(v.string()),

		// Formação e Saúde
		grauInstrucao: v.optional(
			v.union(
				v.literal('fundamental'),
				v.literal('medio'),
				v.literal('superior'),
				v.literal('pos_graduacao'),
				v.literal('mestrado'),
				v.literal('doutorado')
			)
		),
		formacao: v.optional(v.string()),
		formacaoRegistro: v.optional(v.string()),
		grupoSanguineo: v.optional(
			v.union(v.literal('A'), v.literal('B'), v.literal('AB'), v.literal('O'))
		),
		fatorRH: v.optional(v.union(v.literal('positivo'), v.literal('negativo'))),

		// Cargo e Vínculo
		descricaoCargo: v.optional(v.string()),
		nomeacaoPortaria: v.optional(v.string()),
		nomeacaoData: v.optional(v.string()),
		nomeacaoDOE: v.optional(v.string()),
		pertenceOrgaoPublico: v.optional(v.boolean()),
		orgaoOrigem: v.optional(v.string()),
		aposentado: v.optional(v.union(v.literal('nao'), v.literal('funape_ipsep'), v.literal('inss'))),

		// Dados Bancários
		contaBradescoNumero: v.optional(v.string()),
		contaBradescoDV: v.optional(v.string()),
		contaBradescoAgencia: v.optional(v.string()),

		// Documentos Anexos (Storage IDs)
		certidaoAntecedentesPF: v.optional(v.id('_storage')),
		certidaoAntecedentesJFPE: v.optional(v.id('_storage')),
		certidaoAntecedentesSDS: v.optional(v.id('_storage')),
		certidaoAntecedentesTJPE: v.optional(v.id('_storage')),
		certidaoImprobidade: v.optional(v.id('_storage')),
		rgFrente: v.optional(v.id('_storage')),
		rgVerso: v.optional(v.id('_storage')),
		cpfFrente: v.optional(v.id('_storage')),
		cpfVerso: v.optional(v.id('_storage')),
		situacaoCadastralCPF: v.optional(v.id('_storage')),
		tituloEleitorFrente: v.optional(v.id('_storage')),
		tituloEleitorVerso: v.optional(v.id('_storage')),
		comprovanteVotacao: v.optional(v.id('_storage')),
		carteiraProfissionalFrente: v.optional(v.id('_storage')),
		carteiraProfissionalVerso: v.optional(v.id('_storage')),
		comprovantePIS: v.optional(v.id('_storage')),
		certidaoRegistroCivil: v.optional(v.id('_storage')),
		certidaoNascimentoDependentes: v.optional(v.id('_storage')),
		cpfDependentes: v.optional(v.id('_storage')),
		reservistaDoc: v.optional(v.id('_storage')),
		comprovanteEscolaridade: v.optional(v.id('_storage')),
		comprovanteResidencia: v.optional(v.id('_storage')),
		comprovanteContaBradesco: v.optional(v.id('_storage')),

		// Dependentes do funcionário (uploads opcionais)
		dependentes: v.optional(
			v.array(
				v.object({
					parentesco: v.union(
						v.literal('filho'),
						v.literal('filha'),
						v.literal('conjuge'),
						v.literal('outro')
					),
					nome: v.string(),
					cpf: v.string(),
					nascimento: v.string(),
					documentoId: v.optional(v.id('_storage')),
					// Benefícios/declarações por dependente
					salarioFamilia: v.optional(v.boolean()),
					impostoRenda: v.optional(v.boolean())
				})
			)
		),

		// Declarações (Storage IDs)
		declaracaoAcumulacaoCargo: v.optional(v.id('_storage')),
		declaracaoDependentesIR: v.optional(v.id('_storage')),
		declaracaoIdoneidade: v.optional(v.id('_storage')),
		termoNepotismo: v.optional(v.id('_storage')),
		termoOpcaoRemuneracao: v.optional(v.id('_storage'))
	})
		.index('by_matricula', ['matricula'])
		.index('by_nome', ['nome'])
		.index('by_simboloId', ['simboloId'])
		.index('by_simboloTipo', ['simboloTipo'])
		.index('by_cpf', ['cpf'])
		.index('by_rg', ['rg'])
		.index('by_gestor', ['gestorId'])
};
