import type {
  Vehicle,
  VehicleStats,
  UpdateVehiclePayload,
  VehicleProviderOption,
  LinkbycarDisconnectResult,
  LinkbycarCompanySummary,
  LinkbycarBulkDisconnectResult,
  LinkbycarCompanyVerification,
} from "@/domain/entities/vehicle";
import type { VehicleRepository } from "@/domain/repositories/vehicle.repository";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";
import { api } from "@/infrastructure/api/api-client";

export class VehicleRepositoryImpl implements VehicleRepository {
  findAll(params: PaginationQueryParams) {
    return api.get<BackendPaginatedData<Vehicle>>("/vehicles", { params });
  }

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

  update(id: number, payload: UpdateVehiclePayload) {
    return api.put<Vehicle>(`/vehicles/${id}`, payload);
  }

  delete(id: number) {
    return api.delete(`/vehicles/${id}`);
  }

  getStats() {
    return api.get<VehicleStats>("/vehicles/stats");
  }

  connectLinkbycar(vehicleId: number) {
    return api.post<void>(`/vehicles/${vehicleId}/connect-linkbycar`);
  }

  testEligibility(vehicleId: number) {
    return api.post<void>(`/vehicles/${vehicleId}/test-eligibility`);
  }

  disconnectLinkbycar(vehicleId: number) {
    return api.post<LinkbycarDisconnectResult>(`/vehicles/${vehicleId}/disconnect-linkbycar`);
  }

  // companyId is a companies.id — the same id the list's company filter sends,
  // not the users.id used by the ANTAI/companies detail routes.
  getCompanyLinkbycarSummary(companyId: number) {
    return api.get<LinkbycarCompanySummary>(`/vehicles/linkbycar/companies/${companyId}`);
  }

  disconnectCompanyLinkbycar(companyId: number, includeAll: boolean) {
    return api.post<LinkbycarBulkDisconnectResult>(
      `/vehicles/linkbycar/companies/${companyId}/disconnect`,
      { include_all: includeAll }
    );
  }

  verifyCompanyLinkbycar(companyId: number) {
    return api.get<LinkbycarCompanyVerification>(
      `/vehicles/linkbycar/companies/${companyId}/verify`
    );
  }

  getProviderOptions() {
    return api.get<VehicleProviderOption[]>("/vehicles/options/providers");
  }
}
