import { otsApi } from './api';
import { db } from './db';
import { getLocalOtByRouteId, mapRemoteOtToDb } from './offline-ots';

export const otEstadoColors: Record<string, string> = {
  borrador: 'border-slate-200 bg-slate-100 text-slate-700',
  en_proceso: 'border-amber-200 bg-amber-50 text-amber-700',
  cotizada: 'border-violet-200 bg-violet-50 text-violet-700',
  aprobada: 'border-emerald-200 bg-emerald-50 text-emerald-700',
  terminada: 'border-cyan-200 bg-cyan-50 text-cyan-700',
  entregada: 'border-green-200 bg-green-50 text-green-700',
};

export const otNextEstado: Record<string, { next: string; label: string }> = {
  borrador: { next: 'en_proceso', label: 'Iniciar trabajo' },
  en_proceso: { next: 'cotizada', label: 'Pasar a cotizacion' },
  cotizada: { next: 'aprobada', label: 'Marcar aprobada' },
  aprobada: { next: 'terminada', label: 'Marcar terminada' },
  terminada: { next: 'entregada', label: 'Registrar entrega' },
};

export function isOtLocked(ot: any): boolean {
  return String(ot?.estado || '') === 'entregada';
}

export function canMutateOtRemotely(ot: any): boolean {
  if (typeof navigator === 'undefined') return false;
  return Boolean(Number.isFinite(Number(ot?.serverId)) && navigator.onLine && !isOtLocked(ot));
}

export async function refreshOtDetail(routeId: string) {
  const numericId = Number(routeId);

  if (Number.isFinite(numericId) && numericId > 0 && typeof navigator !== 'undefined' && navigator.onLine) {
    try {
      const remote = await otsApi.get(numericId);
      await db.ordenesTrabajo.put(mapRemoteOtToDb(remote));
    } catch (error) {
      console.warn('Using local OT detail cache', error);
    }
  }

  const ot = await getLocalOtByRouteId(routeId);
  if (!ot) return null;

  const [cliente, catalogRows] = await Promise.all([
    ot.clienteTarjeta ? db.clientes.where('tarjeta').equals(ot.clienteTarjeta).first() : null,
    db.catalogos.toArray(),
  ]);

  const cosasTrae = catalogRows
    .filter((row) => row.tipo === 'cosa_trae')
    .sort((a, b) => (a.nombre || '').localeCompare(b.nombre || ''));
  const tiposDano = catalogRows
    .filter((row) => row.tipo === 'tipo_dano')
    .sort((a, b) => (a.nombre || '').localeCompare(b.nombre || ''))
    .map((row) => ({
      id: row.id,
      nombre: row.nombre,
      icono: row.extra?.icono || '',
      color: row.extra?.color || '#ef4444',
    }));

  const inventario = (ot.cosasTrae || []).map((value: any) => {
    const numericValue = Number(value?.cosaTraeId || value?.id || value);
    const match = cosasTrae.find((row) => Number(row.id) === numericValue);
    return match?.nombre || String(value?.nombre || value || numericValue);
  });

  return {
    ot,
    cliente,
    cosasTrae,
    tiposDano,
    inventario,
  };
}
