/* panel-data.jsx — datos mock del panel Treego (multiusuario) */

const fmtCOP = (n) => "$" + (Number(n) || 0).toLocaleString("es-CO");

const PLAN_INFO = {
  gourmet: {
    key: "gourmet", name: "Gourmet Express", price: 199000, used: 0,
    renew: "—", tolerance: 5, perMinute: 800, advanced: false,
    feats: [
      "Domicilios ilimitados",
      "Despacha pedidos en segundos",
      "Rastreo en tiempo real para el cliente",
      "Asignación rápida de repartidores",
    ],
  },
  premium: {
    key: "premium", name: "Premium Partner", price: 389000, used: 0,
    renew: "—", tolerance: 5, perMinute: 800, advanced: true,
    feats: [
      "Domicilios ilimitados",
      "Dashboard avanzado con reportes",
      "Notificaciones automáticas por WhatsApp",
      "Menos riesgo de comida fría",
      "Reembolso si el daño es culpa nuestra",
    ],
  },
  elite: {
    key: "elite", name: "Elite Gastro", price: 649000, used: 0,
    renew: "—", tolerance: 5, perMinute: 800, advanced: true,
    feats: [
      "Domicilios ilimitados",
      "Despacho automático con IA",
      "Cliente informado automáticamente",
      "Prioridad máxima de asignación",
      "Soporte VIP",
      "Cambia de plan cuando quieras",
    ],
  },
};

// sesión activa (mutable) — la llena loadRestaurantData con datos reales de Supabase
const S = { user: null, rest: null, plan: null };

const STAGES = ["En camino al restaurante", "En restaurante", "Recogió pedido", "En camino al cliente", "Entregado"];
const STAGE_ICONS = ["truck", "building", "pkg", "route", "check"];

const ORDERS = [
  { id: "2847", client: "María Restrepo", zone: "Cajicá · Capellanía", driver: "Andrés Mejía", stage: 2, eta: 8, total: 64000, items: 3, time: "1:24 p. m." },
  { id: "2846", client: "Jorge Buitrago", zone: "Chía · Bojacá", driver: "Valentina Ríos", stage: 1, eta: 19, total: 41500, items: 2, time: "1:19 p. m." },
  { id: "2845", client: "Laura Méndez", zone: "Tabio · Centro", driver: "Camilo Ortiz", stage: 0, eta: 26, total: 88000, items: 5, time: "1:11 p. m." },
  { id: "2844", client: "Andrés Salas", zone: "Cajicá · Río Frío", driver: "Andrés Mejía", stage: 3, eta: 5, total: 33000, items: 1, time: "1:02 p. m." },
];

const DELIVERED_TODAY = [
  { id: "2843", client: "Camila Roa", zone: "Chía · La Balsa", driver: "Valentina Ríos", arrival: 9, total: 52000, time: "12:48 p. m.", rating: 5 },
  { id: "2842", client: "Felipe Niño", zone: "Cajicá · Centro", driver: "Camilo Ortiz", arrival: 11, total: 47500, time: "12:30 p. m.", rating: 5 },
  { id: "2841", client: "Sara Lozano", zone: "Tabio · Río Frío", driver: "Andrés Mejía", arrival: 10, total: 71000, time: "12:12 p. m.", rating: 4 },
];

const DRIVERS = [
  { name: "Andrés Mejía", years: "3 años", rating: "4,97", deliveries: 1240, punct: "99,6%", hyg: "100%", phone: "300 482 1190", trainings: ["Manejo de alimentos", "Cadena de frío", "Conducción segura", "Atención al cliente"], badge: "Top 1% Treego", recent: [["2847", "María Restrepo", "En curso"], ["2844", "Andrés Salas", "En curso"], ["2841", "Sara Lozano", "Entregado"]] },
  { name: "Valentina Ríos", years: "2 años", rating: "4,93", deliveries: 720, punct: "99,1%", hyg: "100%", phone: "311 905 7724", trainings: ["Manejo de alimentos", "Atención al cliente"], badge: "Verificada", recent: [["2846", "Jorge Buitrago", "En curso"], ["2843", "Camila Roa", "Entregado"]] },
  { name: "Camilo Ortiz", years: "4 años", rating: "4,95", deliveries: 1605, punct: "98,8%", hyg: "99,4%", phone: "320 117 3382", trainings: ["Cadena de frío", "Conducción segura"], badge: "Verificado", recent: [["2845", "Laura Méndez", "En curso"], ["2842", "Felipe Niño", "Entregado"]] },
];

const HISTORY = [
  ["2841", "30 may", "Sara Lozano", "Andrés Mejía", "10 min", "Entregado", 71000],
  ["2839", "30 may", "Pablo Cárdenas", "Camilo Ortiz", "12 min", "Entregado", 39000],
  ["2836", "29 may", "Daniela Cruz", "Valentina Ríos", "9 min", "Entregado", 55500],
  ["2833", "29 may", "Mateo Ríos", "Andrés Mejía", "11 min", "Entregado", 42000],
  ["2831", "28 may", "Lucía Pardo", "Camilo Ortiz", "13 min", "Multa aplicada", 60000],
  ["2829", "28 may", "Tomás Vega", "Valentina Ríos", "10 min", "Entregado", 48000],
  ["2825", "27 may", "Elena Quintero", "Andrés Mejía", "8 min", "Entregado", 83000],
  ["2822", "27 may", "Ricardo Soto", "Camilo Ortiz", "12 min", "Entregado", 29500],
  ["2818", "26 may", "Natalia Bernal", "Valentina Ríos", "11 min", "Entregado", 67000],
];

const FINES = [{ id: "2831", date: "28 may", driver: "Camilo Ortiz", waited: 18, fee: 1500, minutes: 3 }];

/* ── Tickets de incidencias (restaurante) ─────────────────────────
   Capa de datos del panel (Bloque 6): todo el acceso a Supabase pasa
   por el repositorio window.TreegoRepo (lib/services/repositorio.js). */
async function crearTicket(payload, file) {
  const Repo = window.TreegoRepo;
  if (!window.treego_db) return { data: null, error: { message: "Sin conexión con la base de datos." } };
  let foto_url = null;
  if (file) {
    /* bucket privado (F2 p42): se guarda el PATH; el admin firma al leer */
    const { path, error: ferr } = await window.treegoSubirFoto("tickets", "ticket_" + (payload.pedido_id || "x"), file);
    if (ferr) return { data: null, error: { message: ferr } };
    foto_url = path;
  }
  const creado_por = await Repo.sesion.emailActual();
  const fila = {
    pedido_id: payload.pedido_id || null,
    restaurante_id: payload.restaurante_id || null,
    repartidor_id: payload.repartidor_id || null,
    tipo_incidencia: payload.tipo_incidencia,
    descripcion: payload.descripcion || null,
    foto_url: foto_url,
    creado_por: creado_por,
  };
  const { data, error } = await Repo.tickets.crear(fila);
  if (error || !data) return { data, error };
  // PQR espejo (queja_pedido) vinculado al ticket recién creado
  const usuario_id = creado_por ? await Repo.sesion.usuarioIdPorEmail(creado_por) : null;
  await Repo.pqrs.crearSimple({
    usuario_id: usuario_id, restaurante_id: payload.restaurante_id || null, ticket_id: data.id,
    tipo: "queja_pedido", asunto: "Incidencia de pedido", mensaje: payload.descripcion || null,
    canal: "panel", estado: "abierto",
  });
  return { data, error };
}

async function cargarMisTickets() {
  if (!window.treego_db) return [];
  // RLS limita a los tickets del propio restaurante
  const { data } = await window.TreegoRepo.tickets.mios();
  return data || [];
}

// Pedidos entregados del restaurante (para el selector de "Reportar incidencia").
// RLS (pedidos_select_own) ya limita a los pedidos del propio restaurante.
async function cargarPedidosReportables() {
  if (!window.treego_db) return [];
  const { data } = await window.TreegoRepo.pedidos.entregadosRecientes(30);
  return data || [];
}

// Encuesta de satisfacción post-entrega (estrellas + NPS + tiempo + estado + comentario).
// RLS (calificaciones_insert_own) limita a pedidos del propio restaurante y a fuente='restaurante'.
async function crearCalificacion(payload) {
  if (!window.treego_db) return { error: { message: "Sin conexión con la base de datos." } };
  const { error } = await window.TreegoRepo.calificaciones.crear({
    pedido_id:               payload.pedido_id,
    restaurante_id:          payload.restaurante_id,
    repartidor_id:           payload.repartidor_id || null,
    puntuacion:              payload.puntuacion,
    pregunta_recomendaria:   payload.recomendaria,
    pregunta_tiempo_entrega: payload.tiempo || null,
    pregunta_estado_pedido:  payload.estado || null,
    comentario:              payload.comentario || null,
    fuente:                  "restaurante",
  });
  return { error };
}

// Pedidos entregados que el restaurante aún NO ha calificado (fuente='restaurante').
async function cargarPedidosSinCalificar() {
  if (!window.treego_db) return [];
  const { data } = await window.TreegoRepo.pedidos.entregadosConCalificaciones(50);
  return (data || []).filter((p) => p.repartidor_id && !(p.calificaciones || []).some((c) => c.fuente === "restaurante"));
}

// Histórico de calificaciones dadas por el restaurante.
async function cargarMisCalificaciones() {
  if (!window.treego_db) return [];
  const { data } = await window.TreegoRepo.calificaciones.delRestaurante(100);
  return data || [];
}

// Encuesta del cliente final: link con token para compartir por WhatsApp.
async function cargarEncuestaCliente(pedidoId) {
  if (!window.treego_db) return null;
  const { data } = await window.TreegoRepo.encuestas.dePedido(pedidoId);
  return data || null;
}

function linkEncuestaCliente(token) {
  return window.location.origin + "/encuesta?token=" + token;
}

/* Cancela un pedido (RPC valida etapa: solo hasta en_restaurante, nunca recogido). */
async function cancelarPedido(pedidoId, motivo) {
  if (!window.treego_db) return { ok: false, motivo: "Sin conexión con la base de datos." };
  const { data, error } = await window.TreegoRepo.pedidos.cancelar(pedidoId, motivo);
  if (error) return { ok: false, motivo: error.message };
  const r = Array.isArray(data) ? data[0] : data;
  return { ok: !!(r && r.ok), motivo: (r && r.motivo) || "No se pudo cancelar el pedido." };
}

const MOTIVOS_CANCELACION = ["Error en el pedido", "Cliente canceló", "Problema con el restaurante", "Otro"];
/* estados en los que el pedido aún se puede cancelar — fuente única: lib/types/entidades.js */
const ESTADOS_CANCELABLES = window.ENTIDADES_ESTADOS_CANCELABLES || ["creado", "asignado", "en_camino_restaurante", "en_restaurante"];

/* Rastreo público del pedido (F2 p50): token para compartir con el cliente. */
async function cargarRastreoPedido(pedidoId) {
  if (!window.treego_db) return null;
  const { data } = await window.treego_db
    .from("rastreo_tokens").select("token").eq("pedido_id", pedidoId).maybeSingle();
  return data ? data.token : null;
}

function linkRastreo(token) {
  return window.location.origin + "/rastreo?token=" + token;
}

function linkWhatsAppRastreo(telefono, token, codigo) {
  const tel = String(telefono || "").replace(/\D/g, "");
  const num = tel.length === 10 ? "57" + tel : tel;
  const msg = "¡Tu pedido" + (codigo ? " #" + codigo : "") + " va en camino! 🛵 Síguelo en vivo aquí: " + linkRastreo(token);
  return "https://wa.me/" + num + "?text=" + encodeURIComponent(msg);
}

function linkWhatsAppEncuesta(telefono, token) {
  const tel = String(telefono || "").replace(/\D/g, "");
  const num = tel.length === 10 ? "57" + tel : tel;
  const msg = "¡Hola! Tu pedido fue entregado 🛵 ¿Nos ayudas calificando al repartidor? Solo toma 10 segundos: " + linkEncuestaCliente(token);
  return "https://wa.me/" + num + "?text=" + encodeURIComponent(msg);
}

async function crearPQR(payload) {
  if (!window.treego_db) return { data: null, error: { message: "Sin conexión con la base de datos." } };
  const fila = {
    usuario_id: payload.usuario_id || null,
    restaurante_id: payload.restaurante_id || null,
    tipo: payload.tipo,
    asunto: payload.asunto || null,
    mensaje: payload.mensaje || null,
    canal: "panel",
  };
  const { data, error } = await window.TreegoRepo.pqrs.crear(fila);
  return { data, error };
}

async function cargarMisPQRs() {
  if (!window.treego_db) return [];
  // RLS limita a los PQRs del propio restaurante
  const { data } = await window.TreegoRepo.pqrs.mios();
  return data || [];
}

Object.assign(window, { fmtCOP, S, PLAN_INFO, STAGES, STAGE_ICONS, ORDERS, DELIVERED_TODAY, DRIVERS, HISTORY, FINES, crearTicket, cargarMisTickets, cargarPedidosReportables, crearCalificacion, crearPQR, cargarMisPQRs, cargarPedidosSinCalificar, cargarMisCalificaciones, cargarEncuestaCliente, linkEncuestaCliente, linkWhatsAppEncuesta, cancelarPedido, MOTIVOS_CANCELACION, ESTADOS_CANCELABLES, cargarRastreoPedido, linkRastreo, linkWhatsAppRastreo });
