import * as kv from "./kv_store.tsx";
import * as tonlineConfig from "./tonline-config.tsx";

// Módulos disponíveis no F-Tonline
export type ModuloId =
  | "faturacao-vendas"
  | "contabilidade"
  | "compras-fornecedores"
  | "stock-inventario"
  | "recursos-humanos"
  | "relatorios"
  | "gestao-frotas";

export type Modulo = {
  id: ModuloId;
  nome: string;
  descricao: string;
  icone: string;
  taxaInscricaoDefault: number; // Taxa única de ativação
  avencaDefault: number; // Mensalidade padrão
  ordem: number;
  comercializavel?: boolean;
  fase?: "ativo" | "futuro";
};

// Módulos do sistema F-Tonline
export const MODULOS_SISTEMA: Modulo[] = [
  {
    id: "faturacao-vendas",
    nome: "Faturação e Vendas",
    descricao: "Gestão completa de vendas, faturas, recibos e documentos fiscais",
    icone: "FileText",
    taxaInscricaoDefault: 0,
    avencaDefault: 0,
    ordem: 1,
    comercializavel: true,
    fase: "ativo",
  },
  {
    id: "contabilidade",
    nome: "Contabilidade",
    descricao: "Plano de contas, lançamentos contábeis, balancetes e demonstrações",
    icone: "Calculator",
    taxaInscricaoDefault: 0,
    avencaDefault: 0,
    ordem: 2,
    comercializavel: true,
    fase: "ativo",
  },
  {
    id: "compras-fornecedores",
    nome: "Compras e Fornecedores",
    descricao: "Gestão de fornecedores, encomendas e contas a pagar",
    icone: "ShoppingCart",
    taxaInscricaoDefault: 0,
    avencaDefault: 0,
    ordem: 3,
    comercializavel: true,
    fase: "ativo",
  },
  {
    id: "stock-inventario",
    nome: "Stock e Inventário",
    descricao: "Controle de stock, armazéns, movimentos e inventários",
    icone: "Package",
    taxaInscricaoDefault: 0,
    avencaDefault: 0,
    ordem: 4,
    comercializavel: true,
    fase: "ativo",
  },
  {
    id: "recursos-humanos",
    nome: "Recursos Humanos",
    descricao: "Gestão de pessoal, salários, férias e processamento salarial",
    icone: "Users",
    taxaInscricaoDefault: 0,
    avencaDefault: 0,
    ordem: 5,
    comercializavel: true,
    fase: "ativo",
  },
  {
    id: "relatorios",
    nome: "Tesouraria",
    descricao: "Contas a receber/pagar, recebimentos, pagamentos, fluxo de caixa e reconciliação bancária",
    icone: "CreditCard",
    taxaInscricaoDefault: 0,
    avencaDefault: 0,
    ordem: 6,
    comercializavel: true,
    fase: "ativo",
  },
  {
    id: "gestao-frotas",
    nome: "Gestão de Frotas",
    descricao: "Controle de viaturas, manutenções, combustível e motoristas",
    icone: "Truck",
    taxaInscricaoDefault: 0,
    avencaDefault: 0,
    ordem: 7,
    comercializavel: false,
    fase: "futuro",
  },
];

// Módulo contratado por uma empresa
export type ModuloEmpresa = {
  moduloId: ModuloId;
  ativo: boolean; // Se o módulo está ativo para uso
  taxaInscricao: number; // Taxa de ativação personalizada
  avenca: number; // Mensalidade personalizada
  dataAtivacao: string;
  dataDesativacao?: string;
  observacoes?: string;
};

// Planos pré-configurados
export type PlanoId =
  | "mensal"
  | "trimestral"
  | "semestral"
  | "anual"
  | "basico"
  | "contabilidade"
  | "recursos-humanos"
  | "recomendado"
  | "gestao-frotas"
  | "completo";

export type Plano = {
  id: PlanoId;
  nome: string;
  descricao: string;
  modulos: ModuloId[];
  taxaInscricaoTotal: number;
  avencaTotal: number;
  cicloMeses?: number;
  descontoPercentual?: number;
  valorPrimeiroPagamento?: number;
  legado?: boolean;
  destaque?: boolean;
  promocaoAtiva?: boolean;
  promocaoDescricao?: string;
  promocaoPercentual?: number;
  ativo?: boolean;
};

const MODULOS_PRINCIPAIS: ModuloId[] = [
  "faturacao-vendas",
  "compras-fornecedores",
  "stock-inventario",
  "contabilidade",
  "recursos-humanos",
];

export const PLANOS_DISPONIVEIS: Plano[] = [
  {
    id: "mensal",
    nome: "Plano Mensal",
    descricao: "Pagamento mensal com todos os módulos principais activos",
    modulos: MODULOS_PRINCIPAIS,
    taxaInscricaoTotal: 10,
    avencaTotal: 10,
    cicloMeses: 1,
    descontoPercentual: 0,
    valorPrimeiroPagamento: 20,
  },
  {
    id: "trimestral",
    nome: "Plano Trimestral",
    descricao: "Pagamento a cada 3 meses com todos os módulos principais activos",
    modulos: MODULOS_PRINCIPAIS,
    taxaInscricaoTotal: 5000,
    avencaTotal: 4350,
    cicloMeses: 3,
    descontoPercentual: 3,
    valorPrimeiroPagamento: 9350,
    destaque: true,
  },
  {
    id: "semestral",
    nome: "Plano Semestral",
    descricao: "Pagamento a cada 6 meses com todos os módulos principais activos",
    modulos: MODULOS_PRINCIPAIS,
    taxaInscricaoTotal: 5000,
    avencaTotal: 8400,
    cicloMeses: 6,
    descontoPercentual: 7,
    valorPrimeiroPagamento: 13400,
  },
  {
    id: "anual",
    nome: "Plano Anual",
    descricao: "Pagamento anual com todos os módulos principais activos",
    modulos: MODULOS_PRINCIPAIS,
    taxaInscricaoTotal: 5000,
    avencaTotal: 16200,
    cicloMeses: 12,
    descontoPercentual: 10,
    valorPrimeiroPagamento: 21200,
  },
];

export const PLANOS_LEGADOS: Plano[] = [
  {
    id: "basico",
    nome: "Pacote Básico",
    descricao: "Faturação, Stock e Compras - Essencial para iniciar",
    modulos: ["faturacao-vendas", "stock-inventario", "compras-fornecedores"],
    taxaInscricaoTotal: 5000,
    avencaTotal: 2000,
    cicloMeses: 1,
    descontoPercentual: 0,
    valorPrimeiroPagamento: 7000,
    legado: true,
  },
  {
    id: "contabilidade",
    nome: "Pacote Contabilidade",
    descricao: "Gestão contábil completa",
    modulos: ["contabilidade"],
    taxaInscricaoTotal: 3000,
    avencaTotal: 1500,
    cicloMeses: 1,
    descontoPercentual: 0,
    valorPrimeiroPagamento: 4500,
    legado: true,
  },
  {
    id: "recursos-humanos",
    nome: "Pacote Recursos Humanos",
    descricao: "Gestão de pessoal e processamento salarial",
    modulos: ["recursos-humanos"],
    taxaInscricaoTotal: 3500,
    avencaTotal: 1800,
    cicloMeses: 1,
    descontoPercentual: 0,
    valorPrimeiroPagamento: 5300,
    legado: true,
  },
  {
    id: "recomendado",
    nome: "Pacote Recomendado",
    descricao: "Básico + Contabilidade + RH - Solução completa para PMEs",
    modulos: MODULOS_PRINCIPAIS,
    taxaInscricaoTotal: 8000,
    avencaTotal: 3500,
    cicloMeses: 1,
    descontoPercentual: 0,
    valorPrimeiroPagamento: 11500,
    legado: true,
    destaque: true,
  },
  {
    id: "gestao-frotas",
    nome: "Pacote Gestão de Frotas",
    descricao: "Controle de viaturas e manutenções",
    modulos: ["gestao-frotas"],
    taxaInscricaoTotal: 2500,
    avencaTotal: 1200,
    cicloMeses: 1,
    descontoPercentual: 0,
    valorPrimeiroPagamento: 3700,
    legado: true,
  },
  {
    id: "completo",
    nome: "Pacote Completo",
    descricao: "Todos os módulos do sistema F-Tonline",
    modulos: [
      "faturacao-vendas",
      "contabilidade",
      "compras-fornecedores",
      "stock-inventario",
      "recursos-humanos",
      "relatorios",
      "gestao-frotas",
    ],
    taxaInscricaoTotal: 12000,
    avencaTotal: 4000,
    cicloMeses: 1,
    descontoPercentual: 0,
    valorPrimeiroPagamento: 16000,
    legado: true,
  },
];

export const PLANOS_COMPATIBILIDADE: Plano[] = [
  ...PLANOS_DISPONIVEIS,
  ...PLANOS_LEGADOS,
];

export function obterPlanoPorId(planoId: string): Plano | undefined {
  return PLANOS_COMPATIBILIDADE.find((plano) => plano.id === planoId);
}

function planoConfigParaPlano(plano: tonlineConfig.PlanoConfig): Plano {
  return {
    ...plano,
    id: plano.id as PlanoId,
    modulos: plano.modulos as ModuloId[],
  };
}

export async function obterPlanosDisponiveisConfigurados(): Promise<Plano[]> {
  try {
    const planos = await tonlineConfig.obterPlanosPublicosConfigurados();
    if (!planos.length) return PLANOS_DISPONIVEIS;
    return planos.map(planoConfigParaPlano);
  } catch (error) {
    console.error("[MODULOS] Erro ao carregar planos configurados:", error);
    return PLANOS_DISPONIVEIS;
  }
}

export async function obterPlanosCompatibilidadeConfigurados(): Promise<Plano[]> {
  const planosPublicos = await obterPlanosDisponiveisConfigurados();
  return [...planosPublicos, ...PLANOS_LEGADOS];
}

export async function obterPlanoConfiguradoPorId(planoId: string): Promise<Plano | undefined> {
  const planos = await obterPlanosCompatibilidadeConfigurados();
  return planos.find((plano) => plano.id === planoId);
}

const MODULOS_PREFIX = "modulos_empresa:";

/**
 * Obter módulos de uma empresa
 */
export async function obterModulosEmpresa(empresaId: string): Promise<ModuloEmpresa[]> {
  try {
    const modulos = await kv.get(`${MODULOS_PREFIX}${empresaId}`);
    return (modulos as ModuloEmpresa[]) || [];
  } catch (error) {
    // console.error("[MODULOS] Erro ao obter módulos:", error);
    return [];
  }
}

/**
 * Configurar módulos da empresa (aplicar plano ou personalizar)
 */
export async function configurarModulosEmpresa(
  empresaId: string,
  modulos: ModuloEmpresa[]
): Promise<{ success: boolean; error?: string }> {
  try {
    await kv.set(`${MODULOS_PREFIX}${empresaId}`, modulos);
    // console.log(`[MODULOS] Módulos configurados para empresa ${empresaId}`);
    return { success: true };
  } catch (error) {
    // console.error("[MODULOS] Erro ao configurar módulos:", error);
    return { success: false, error: `Erro ao configurar módulos: ${error.message}` };
  }
}

/**
 * Aplicar plano pré-configurado a uma empresa
 */
export async function aplicarPlano(
  empresaId: string,
  planoId: PlanoId
): Promise<{ success: boolean; error?: string }> {
  try {
    const plano = await obterPlanoConfiguradoPorId(planoId);
    if (!plano) {
      return { success: false, error: "Plano não encontrado" };
    }

    const modulosEmpresa: ModuloEmpresa[] = plano.modulos.map((moduloId) => {
      const moduloSistema = MODULOS_SISTEMA.find((m) => m.id === moduloId);
      return {
        moduloId,
        ativo: true,
        taxaInscricao: 0,
        avenca: 0,
        dataAtivacao: new Date().toISOString(),
      };
    });

    await configurarModulosEmpresa(empresaId, modulosEmpresa);
    
    // console.log(`[MODULOS] Plano ${plano.nome} aplicado à empresa ${empresaId}`);
    return { success: true };
  } catch (error) {
    // console.error("[MODULOS] Erro ao aplicar plano:", error);
    return { success: false, error: `Erro ao aplicar plano: ${error.message}` };
  }
}

/**
 * Ativar/Desativar um módulo específico
 */
export async function toggleModulo(
  empresaId: string,
  moduloId: ModuloId,
  ativo: boolean
): Promise<{ success: boolean; error?: string }> {
  try {
    const modulos = await obterModulosEmpresa(empresaId);
    const moduloIndex = modulos.findIndex((m) => m.moduloId === moduloId);

    if (moduloIndex === -1) {
      return { success: false, error: "Módulo não encontrado na empresa" };
    }

    modulos[moduloIndex].ativo = ativo;
    if (!ativo) {
      modulos[moduloIndex].dataDesativacao = new Date().toISOString();
    }

    await configurarModulosEmpresa(empresaId, modulos);
    
    // console.log(`[MODULOS] Módulo ${moduloId} ${ativo ? 'ativado' : 'desativado'} para empresa ${empresaId}`);
    return { success: true };
  } catch (error) {
    // console.error("[MODULOS] Erro ao alternar módulo:", error);
    return { success: false, error: `Erro ao alternar módulo: ${error.message}` };
  }
}

/**
 * Calcular total de taxa de inscrição e avença
 */
export function calcularTotais(modulos: ModuloEmpresa[]): { taxaInscricaoTotal: number; avencaTotal: number } {
  const modulosAtivos = modulos.filter((m) => m.ativo);
  
  const taxaInscricaoTotal = modulosAtivos.reduce((acc, m) => acc + m.taxaInscricao, 0);
  const avencaTotal = modulosAtivos.reduce((acc, m) => acc + m.avenca, 0);

  return { taxaInscricaoTotal, avencaTotal };
}
