import { DriversApiClient } from '@/lib/api/drivers/DriversApiClient';
import { getWebsiteApiBaseUrl } from '@/lib/config/apiBaseUrl';
import { Result } from '@/lib/contracts/Result';
import type { Service } from '@/lib/contracts/services/Service';
import { ConsoleErrorReporter } from '@/lib/infrastructure/logging/ConsoleErrorReporter';
import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger';
import type { GetDriverProfileOutputDTO } from '@/lib/types/generated/GetDriverProfileOutputDTO';

type DriverProfileServiceError = 'notFound' | 'unauthorized' | 'serverError' | 'unknown';

export class DriverProfileService implements Service {
  private apiClient: DriversApiClient;

  constructor() {
    const baseUrl = getWebsiteApiBaseUrl();
    const logger = new ConsoleLogger();
    const errorReporter = new ConsoleErrorReporter();
    this.apiClient = new DriversApiClient(baseUrl, errorReporter, logger);
  }

  async getDriverProfile(driverId: string): Promise<Result<GetDriverProfileOutputDTO, DriverProfileServiceError>> {
    try {
      const dto = await this.apiClient.getDriverProfile(driverId);

      if (!dto.currentDriver) {
        return Result.err('notFound');
      }

      return Result.ok(dto);
    } catch (error) {
      const errorAny = error as { statusCode?: number; message?: string };

      if (errorAny.statusCode === 401 || errorAny.message?.toLowerCase().includes('unauthorized')) {
        return Result.err('unauthorized');
      }

      if (errorAny.statusCode === 404 || errorAny.message?.toLowerCase().includes('not found')) {
        return Result.err('notFound');
      }

      if (errorAny.statusCode && errorAny.statusCode >= 500) {
        return Result.err('serverError');
      }

      return Result.err('unknown');
    }
  }
}
