import 'package:dartz/dartz.dart';
import '../../../services/user_service.dart';
import '../../../core/errors/failures.dart';
import '../base_usecase.dart';

/// 비밀번호 재설정 파라미터
class ResetPasswordParams {
  final int userId;
  final String newPassword;
  final String? currentPassword; // 자기 자신의 비밀번호 변경 시 필요

  const ResetPasswordParams({
    required this.userId,
    required this.newPassword,
    this.currentPassword,
  });
}

/// 비밀번호 재설정 UseCase
/// 관리자는 다른 사용자 비밀번호 재설정 가능
/// 일반 사용자는 자신의 비밀번호만 변경 가능 (현재 비밀번호 필요)
class ResetPasswordUseCase extends UseCase<bool, ResetPasswordParams> {
  final UserService _userService;

  ResetPasswordUseCase(this._userService);

  @override
  Future<Either<Failure, bool>> call(ResetPasswordParams params) async {
    try {
      // 비밀번호 유효성 검증
      final validationResult = _validatePassword(params.newPassword);
      if (validationResult != null) {
        return Left(validationResult);
      }

      final success = await _userService.resetPassword(
        userId: params.userId,
        newPassword: params.newPassword,
      );
      
      return Right(success);
    } catch (e) {
      if (e.toString().contains('권한')) {
        return Left(PermissionFailure(
          message: '비밀번호를 재설정할 권한이 없습니다.',
          code: 'PERMISSION_DENIED',
          originalError: e,
        ));
      } else if (e.toString().contains('일치하지 않')) {
        return Left(AuthFailure(
          message: '현재 비밀번호가 일치하지 않습니다.',
          code: 'INVALID_CURRENT_PASSWORD',
          originalError: e,
        ));
      } else if (e.toString().contains('찾을 수 없')) {
        return Left(ValidationFailure(
          message: '사용자를 찾을 수 없습니다.',
          code: 'USER_NOT_FOUND',
          originalError: e,
        ));
      } else {
        return Left(ServerFailure(
          message: '비밀번호 재설정 중 오류가 발생했습니다.',
          originalError: e,
        ));
      }
    }
  }

  ValidationFailure? _validatePassword(String password) {
    final errors = <String, String>{};

    if (password.length < 8) {
      errors['password'] = '비밀번호는 8자 이상이어야 합니다.';
    }

    if (!RegExp(r'^(?=.*[A-Za-z])(?=.*\d)').hasMatch(password)) {
      errors['password'] = '비밀번호는 영문과 숫자를 포함해야 합니다.';
    }

    if (!RegExp(r'[!@#$%^&*(),.?":{}|<>]').hasMatch(password)) {
      errors['password'] = '비밀번호는 특수문자를 포함해야 합니다.';
    }

    if (errors.isNotEmpty) {
      return ValidationFailure(
        message: '비밀번호가 보안 요구사항을 충족하지 않습니다.',
        errors: errors,
      );
    }

    return null;
  }
}