'use client';

import { clearSession, readSession } from '../lib/auth-session';

export const apiBase = process.env.NEXT_PUBLIC_API_URL ?? 'http://localhost:3001/api';

export async function fetchWithSession(path: string, init?: RequestInit) {
  const session = readSession();
  if (!session?.accessToken) {
    throw new Error('Sessao da loja ausente.');
  }

  const headers = new Headers(init?.headers);
  headers.set('Authorization', `Bearer ${session.accessToken}`);
  if (!(init?.body instanceof FormData)) {
    headers.set('Content-Type', 'application/json');
  }

  const response = await fetch(`${apiBase}${path}`, {
    ...init,
    headers,
  });

  const payload = await response.json().catch(() => null);
  if (!response.ok) {
    const message = Array.isArray(payload?.message) ? payload.message.join(' ') : payload?.message;
    if (response.status === 401) {
      clearSession();
      throw new Error('Sua sessão da loja expirou ou ficou inválida. Entre novamente.');
    }
    throw new Error(message ?? 'Falha na integração da loja com a API.');
  }

  return payload;
}

export function currency(value?: number | string | null) {
  const number = Number(value ?? 0);
  return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(number);
}

export function humanStatus(status?: string | null) {
  const labels: Record<string, string> = {
    ACTIVE: 'Ativo',
    PENDING: 'Pendente',
    PREPARING: 'Em preparo',
    IN_PROGRESS: 'Em andamento',
    DRIVER_ACCEPTED: 'Motoboy a caminho da loja',
    DELIVERED: 'Entregue',
    PAID: 'Pago',
    OPEN: 'Aberto',
    RESOLVED: 'Resolvido',
    SUSPENDED: 'Suspenso',
    REJECTED: 'Rejeitado',
    CANCELLED: 'Cancelado',
    FAILED: 'Falhou',
    CLOSED: 'Fechado',
    READY_FOR_PICKUP: 'Pronto para retirada',
    SEARCHING_DRIVER: 'Buscando motoboy',
    SENT_TO_RESTAURANT: 'Aguardando aceite da loja',
    PICKED_UP: 'Pedido retirado',
    ON_THE_WAY: 'Saiu para entrega',
  };

  return labels[status ?? ''] ?? (status ?? 'Desconhecido').replaceAll('_', ' ');
}

export function statusTone(status?: string | null) {
  switch (status) {
    case 'ACTIVE':
    case 'DELIVERED':
    case 'PAID':
    case 'OPEN':
    case 'RESOLVED':
      return 'emerald';
    case 'PENDING':
    case 'PREPARING':
    case 'IN_PROGRESS':
    case 'DRIVER_ACCEPTED':
      return 'amber';
    case 'SUSPENDED':
    case 'REJECTED':
    case 'CANCELLED':
    case 'FAILED':
    case 'CLOSED':
      return 'rose';
    default:
      return 'sky';
  }
}
