import type {
  TelematicsOrder,
  TelematicsOrderDetail,
  TelematicsOrderStats,
  RequestInstallationPayload,
  RequestInstallationResult,
  OrderInstallationRequest,
} from "@/domain/entities/telematics-order";
import type { TelematicsOrderRepository } from "@/domain/repositories/telematics-order.repository";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";
import { api } from "@/infrastructure/api/api-client";

const BASE = "/telematics-box-orders";

export class TelematicsOrderRepositoryImpl implements TelematicsOrderRepository {
  findAll(params: PaginationQueryParams) {
    return api.get<BackendPaginatedData<TelematicsOrder>>(BASE, { params });
  }

  findById(id: number) {
    return api.get<TelematicsOrderDetail>(`${BASE}/${id}`);
  }

  getStats() {
    return api.get<TelematicsOrderStats>(`${BASE}/stats`);
  }

  accept(id: number, orderDate: string, note?: string) {
    return api.post<TelematicsOrderDetail>(`${BASE}/${id}/accept`, {
      order_date: orderDate,
      ...(note ? { note } : {}),
    });
  }

  reject(id: number, reason: string) {
    return api.post<TelematicsOrderDetail>(`${BASE}/${id}/reject`, { reason });
  }

  markDelivered(id: number, receivedDate: string) {
    return api.post<TelematicsOrderDetail>(`${BASE}/${id}/mark-delivered`, {
      received_at: receivedDate,
    });
  }

  requestInstallation(id: number, payload: RequestInstallationPayload) {
    return api.post<RequestInstallationResult>(
      `${BASE}/${id}/request-installation`,
      payload
    );
  }

  async getInstallationRequests(id: number) {
    // fleet relaie la collection paginée brute du service installateur, de la
    // forme { data: [...], links, meta } (ResourceCollection Laravel).
    const result = await api.get<{ data: OrderInstallationRequest[] }>(
      `${BASE}/${id}/installation-requests`
    );
    return result.data ?? [];
  }
}
