import type {
  AntaiVehicle,
  AntaiVehicleDetail,
  AntaiVehicleStats,
  AntaiVehicleOptions,
  AntaiActionResult,
  AntaiQueuedResult,
  AntaiDisableReason,
  UpdateAntaiExceptionPayload,
} from "@/domain/entities/antai-vehicle";
import type { AntaiVehicleRepository } from "@/domain/repositories/antai-vehicle.repository";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";
import { api } from "@/infrastructure/api/api-client";

const BASE = "/antai/vehicles";
const COMPANIES_BASE = "/antai/companies";

export class AntaiVehicleRepositoryImpl implements AntaiVehicleRepository {
  findAll(params: PaginationQueryParams) {
    return api.get<BackendPaginatedData<AntaiVehicle>>(BASE, { params });
  }

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

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

  getOptions() {
    return api.get<AntaiVehicleOptions>(`${BASE}/options`);
  }

  enable(id: number) {
    return api.post<AntaiActionResult>(`${BASE}/${id}/enable`);
  }

  disable(id: number, reason?: AntaiDisableReason) {
    return api.post<AntaiActionResult>(
      `${BASE}/${id}/disable`,
      reason ? { reason } : undefined
    );
  }

  updateException(id: number, payload: UpdateAntaiExceptionPayload) {
    return api.patch<AntaiActionResult>(`${BASE}/${id}/exception`, payload);
  }

  bulkEnable(vehicleIds: number[]) {
    return api.post<AntaiQueuedResult>(`${BASE}/bulk/enable`, {
      vehicle_ids: vehicleIds,
    });
  }

  bulkDisable(vehicleIds: number[], reason?: AntaiDisableReason) {
    return api.post<AntaiQueuedResult>(`${BASE}/bulk/disable`, {
      vehicle_ids: vehicleIds,
      ...(reason ? { reason } : {}),
    });
  }

  disableCompanyVehicles(companyId: number) {
    return api.post<AntaiQueuedResult>(
      `${COMPANIES_BASE}/${companyId}/disable-vehicles`
    );
  }
}
