import type {
  Vehicle,
  VehicleStats,
  UpdateVehiclePayload,
  VehicleProviderOption,
  LinkbycarDisconnectResult,
  LinkbycarCompanySummary,
  LinkbycarBulkDisconnectResult,
  LinkbycarCompanyVerification,
} from "@/domain/entities/vehicle";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";

export interface VehicleRepository {
  findAll(params: PaginationQueryParams): Promise<BackendPaginatedData<Vehicle>>;
  findById(id: number): Promise<Vehicle>;
  update(id: number, data: UpdateVehiclePayload): Promise<Vehicle>;
  delete(id: number): Promise<void>;
  getStats(): Promise<VehicleStats>;
  connectLinkbycar(vehicleId: number): Promise<void>;
  testEligibility(vehicleId: number): Promise<void>;

  /** Remove one vehicle from LinkByCar. Synchronous; works on archived vehicles too. */
  disconnectLinkbycar(vehicleId: number): Promise<LinkbycarDisconnectResult>;

  /** Company-wide LinkByCar counts. Also the progress read while a bulk disconnect drains. */
  getCompanyLinkbycarSummary(companyId: number): Promise<LinkbycarCompanySummary>;

  /** Queue LinkByCar removal for a whole company (processed off-request). */
  disconnectCompanyLinkbycar(companyId: number, includeAll: boolean): Promise<LinkbycarBulkDisconnectResult>;

  /** Ask LinkByCar which of the company vehicles it still holds. Slower: it pages the provider listing. */
  verifyCompanyLinkbycar(companyId: number): Promise<LinkbycarCompanyVerification>;
  getProviderOptions(): Promise<VehicleProviderOption[]>;
}
