import { Result } from '@core/shared/application/Result';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
import type { IDriverRepository } from '../../domain/repositories/IDriverRepository';
import type { DriverDTO } from '../dto/DriverDTO';
import { EntityMappers } from '../mappers/EntityMappers';

export interface UpdateDriverProfileInput {
  driverId: string;
  bio?: string;
  country?: string;
}

/**
 * Application use case responsible for updating basic driver profile details.
 * Encapsulates domain entity mutation and mapping to a DriverDTO.
 */
export class UpdateDriverProfileUseCase {
  constructor(private readonly driverRepository: IDriverRepository) {}

  async execute(input: UpdateDriverProfileInput): Promise<Result<DriverDTO, ApplicationErrorCode<'DRIVER_NOT_FOUND'>>> {
    const { driverId, bio, country } = input;

    const existing = await this.driverRepository.findById(driverId);
    if (!existing) {
      return Result.err({ code: 'DRIVER_NOT_FOUND' });
    }

    const updated = existing.update({
      ...(bio !== undefined ? { bio } : {}),
      ...(country !== undefined ? { country } : {}),
    });

    const persisted = await this.driverRepository.update(updated);
    const dto = EntityMappers.toDriverDTO(persisted);
    return Result.ok(dto!);
  }
}