import { api } from '../auth/http';
import { URL_CONSTANTS } from '@/constants/URLS';

export const LAST_MILE_STATUSES = [
  'PAYMENT_PENDING',
  'READY_TO_TRANSIT',
  'IN_TRANSIT',
  'DELIVERED',
] as const;
export type LastMileApiStatus = (typeof LAST_MILE_STATUSES)[number];

export interface LastMileBooking {
  id: string;
  reference: string;
  lastMileDeliveryAddress?: string | null;
  cargoFreeText?: string | null;
  cargoTotalWeightVgm: number;
  totalAmount: number;
  scheduledDate?: string | null;
  company?: { id: string; name?: string; phone?: string | null; contactPersonName?: string | null; contactPersonPhone?: string | null } | null;
  serviceType?: { id: string; name?: string } | null;
  originYard?: { id: string; name?: string } | null;
  destinationYard?: { id: string; name?: string } | null;
  cargoType?: { id: string; name?: string } | null;
}

export interface LastMileVehicle {
  id: string;
  plateNumber: string;
  manufacturer: string;
  model: string;
}

export interface LastMileRecord {
  id: string;
  bookingId: string;
  status: LastMileApiStatus;
  advancedPayment: number;
  remainingPayment: number;
  estimatedKm?: number | null;
  exactKm?: number | null;
  vehicleId?: string | null;
  booking?: LastMileBooking | null;
  vehicle?: LastMileVehicle | null;
  createdAt: string;
  updatedAt: string;
}

export interface LastMileListResponse {
  data: LastMileRecord[];
  meta: { total: number; page: number; pageSize: number; totalPages: number };
}

const LM = URL_CONSTANTS.LAST_MILE;

export const lastMileService = {
  list: (pageSize = 1000) =>
    api.get<LastMileListResponse>(`${LM.BASE}?pageSize=${pageSize}`),
  getById: (id: string) => api.get<LastMileRecord>(LM.BY_ID(id)),
  update: (id: string, data: { status?: LastMileApiStatus; vehicleId?: string | null }) =>
    api.patch<LastMileRecord>(LM.BY_ID(id), data),
  accept: (bookingReference: string) =>
    api.post<LastMileRecord>(LM.ACCEPT(bookingReference)),
};
