import 'package:dartz/dartz.dart';
import 'package:injectable/injectable.dart';
import '../../../core/errors/failures.dart';
import '../../repositories/user_repository.dart';
import '../base_usecase.dart';

/// 사용자명 중복 확인 파라미터
class CheckUsernameAvailabilityParams {
  final String username;

  const CheckUsernameAvailabilityParams({
    required this.username,
  });
}

/// 사용자명 사용 가능 여부 확인 UseCase (서버 API v0.2.1 대응)
/// 사용자 생성 및 수정 시 사용자명 중복 검증
@injectable
class CheckUsernameAvailabilityUseCase extends UseCase<bool, CheckUsernameAvailabilityParams> {
  final UserRepository _userRepository;

  CheckUsernameAvailabilityUseCase(this._userRepository);

  @override
  Future<Either<Failure, bool>> call(CheckUsernameAvailabilityParams params) async {
    // 입력값 검증
    if (params.username.trim().isEmpty) {
      return Left(ValidationFailure(
        message: '사용자명을 입력해주세요.',
        errors: {'username': '사용자명을 입력해주세요.'},
      ));
    }

    if (params.username.length < 3) {
      return Left(ValidationFailure(
        message: '사용자명은 3자 이상이어야 합니다.',
        errors: {'username': '사용자명은 3자 이상이어야 합니다.'},
      ));
    }

    // 사용자명 형식 검증 (영문, 숫자, 언더스코어만)
    if (!RegExp(r'^[a-zA-Z0-9_]+$').hasMatch(params.username)) {
      return Left(ValidationFailure(
        message: '사용자명은 영문, 숫자, 언더스코어만 사용 가능합니다.',
        errors: {'username': '사용자명은 영문, 숫자, 언더스코어만 사용 가능합니다.'},
      ));
    }

    return await _userRepository.checkUsernameAvailability(params.username);
  }
}