import { Hono } from "hono";
import { createClient } from "../../src/compat/supabase.js";
import * as kv from "./kv_store.tsx";
import * as revendedores from "./revendedores.tsx";
import * as levantamentos from "./levantamentos-revendedor.tsx";

// Auth: mesmo mecanismo já provado em admin-server-7249dcd9/rh-server-7249dcd9
// (X-User-Token -> supabase.auth.getUser -> resolver o registo próprio, aqui
// Revendedor em vez de Usuario). Ver revendedores.tsx.

const revendedoresRouter = new Hono();

revendedoresRouter.get("/health", (c) => {
  return c.json({ status: "ok" });
});

// Cadastro de um novo revendedor
revendedoresRouter.post("/auth/signup", async (c) => {
  try {
    const dados = await c.req.json();
    const resultado = await revendedores.criarRevendedor(dados);

    if (!resultado.success) {
      return c.json(resultado, 400);
    }

    return c.json(resultado, 201);
  } catch (error: any) {
    return c.json({ success: false, error: error.message }, 500);
  }
});

// Login: valida credenciais no Supabase Auth (client anon-key) e devolve o
// perfil do revendedor. O frontend faz depois o seu próprio
// supabase.auth.signInWithPassword para obter a sessão do browser, tal como
// já acontece em Login.tsx para os utilizadores de empresa.
revendedoresRouter.post("/auth/signin", async (c) => {
  try {
    const { email, password } = await c.req.json();

    if (!email || !password) {
      return c.json({ success: false, error: "Email e senha são obrigatórios" }, 400);
    }

    const supabase = createClient(
      Deno.env.get("SUPABASE_URL") ?? "",
      Deno.env.get("SUPABASE_ANON_KEY") ?? "",
    );

    const { data, error } = await supabase.auth.signInWithPassword({ email, password });

    if (error || !data.session) {
      return c.json({ success: false, error: "Email ou senha incorretos" }, 401);
    }

    const revendedor = await revendedores.buscarRevendedorPorEmail(email);
    if (!revendedor) {
      return c.json({ success: false, error: "Revendedor não encontrado" }, 404);
    }
    if (!revendedor.ativo) {
      return c.json({ success: false, error: "Conta de revendedor inactiva" }, 403);
    }

    return c.json({ success: true, data: revendedor });
  } catch (error: any) {
    return c.json({ success: false, error: error.message }, 500);
  }
});

// Perfil do revendedor autenticado, incluindo o saldo real de comissões
// (Fase 3 do plano) - nunca um valor inventado no frontend.
revendedoresRouter.get("/perfil", async (c) => {
  const revendedor = await revendedores.obterRevendedorAutenticadoRequest(c);
  if (!revendedor) {
    return c.json({ success: false, error: "Sessão inválida ou expirada" }, 401);
  }
  const saldo = await revendedores.obterSaldoRevendedor(revendedor.id);
  return c.json({ success: true, data: { ...revendedor, ...saldo } });
});

// Actualizar o número M-Pesa de destino dos levantamentos - nunca é editável
// no próprio ecrã de levantamento, só aqui (a aba "Perfil"/Configurações).
revendedoresRouter.put("/perfil/numero-mpesa", async (c) => {
  const revendedor = await revendedores.obterRevendedorAutenticadoRequest(c);
  if (!revendedor) {
    return c.json({ success: false, error: "Sessão inválida ou expirada" }, 401);
  }

  const dados = await c.req.json();
  const resultado = await revendedores.atualizarNumeroMpesa(revendedor.id, dados?.numeroMpesa);

  if (!resultado.success) {
    return c.json(resultado, 400);
  }

  return c.json(resultado);
});

// Histórico de levantamentos do revendedor autenticado
revendedoresRouter.get("/levantamentos", async (c) => {
  const revendedor = await revendedores.obterRevendedorAutenticadoRequest(c);
  if (!revendedor) {
    return c.json({ success: false, error: "Sessão inválida ou expirada" }, 401);
  }

  const lista = await levantamentos.listarLevantamentos(revendedor.id);
  return c.json({ success: true, data: lista });
});

// Solicitar levantamento do saldo disponível (B2C, ver mpesa.tsx) - sempre o
// valor total disponível, sem campo de valor parcial.
revendedoresRouter.post("/levantamentos", async (c) => {
  const revendedor = await revendedores.obterRevendedorAutenticadoRequest(c);
  if (!revendedor) {
    return c.json({ success: false, error: "Sessão inválida ou expirada" }, 401);
  }

  const resultado = await levantamentos.solicitarLevantamento(revendedor.id);

  if (!resultado.success) {
    return c.json(resultado, 400);
  }

  return c.json(resultado, 201);
});

// Empresas trazidas pelo revendedor autenticado, através do seu código de
// referência (Empresa.referidoPor). Devolve uma lista vazia enquanto a
// captura do código no cadastro de empresas (Fase 3 do plano) não estiver
// ligada — nunca dados inventados.
revendedoresRouter.get("/empresas-referidas", async (c) => {
  const revendedor = await revendedores.obterRevendedorAutenticadoRequest(c);
  if (!revendedor) {
    return c.json({ success: false, error: "Sessão inválida ou expirada" }, 401);
  }

  const todasEmpresas = await kv.getByPrefix<any>("empresa:");
  const empresasReferidas = todasEmpresas.filter(
    (empresa) => empresa && empresa.referidoPor === revendedor.id,
  );

  return c.json({ success: true, data: empresasReferidas });
});

export default revendedoresRouter;
