import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import '../../repositories/auth_repository.dart';
import '../../../data/models/auth/login_request.dart';
import '../../../data/models/auth/login_response.dart';
import '../../../core/errors/failures.dart';
import '../base_usecase.dart';

/// 로그인 UseCase 파라미터
class LoginParams {
  final String email;
  final String password;

  const LoginParams({
    required this.email,
    required this.password,
  });
}

/// 로그인 UseCase
/// 사용자 인증을 처리하고 토큰을 저장
class LoginUseCase extends UseCase<LoginResponse, LoginParams> {
  final AuthRepository _authRepository;

  LoginUseCase(this._authRepository);

  @override
  Future<Either<Failure, LoginResponse>> call(LoginParams params) async {
    try {
      // 이메일 유효성 검증
      if (!_isValidEmail(params.email)) {
        return Left(ValidationFailure(
          message: '올바른 이메일 형식이 아닙니다.',
          errors: {'email': '올바른 이메일 형식이 아닙니다.'},
        ));
      }

      // 비밀번호 유효성 검증
      if (params.password.isEmpty) {
        return Left(ValidationFailure(
          message: '비밀번호를 입력해주세요.',
          errors: {'password': '비밀번호를 입력해주세요.'},
        ));
      }

      // 로그인 요청
      final loginRequest = LoginRequest(
        email: params.email,
        password: params.password,
      );

      return await _authRepository.login(loginRequest);
    } on DioException catch (e) {
      if (e.response?.statusCode == 401) {
        return Left(AuthFailure(
          message: '이메일 또는 비밀번호가 올바르지 않습니다.',
          code: 'INVALID_CREDENTIALS',
          originalError: e,
        ));
      } else if (e.type == DioExceptionType.connectionTimeout ||
                 e.type == DioExceptionType.receiveTimeout) {
        return Left(NetworkFailure(
          message: '네트워크 연결 시간이 초과되었습니다.',
          code: 'TIMEOUT',
          originalError: e,
        ));
      } else if (e.type == DioExceptionType.connectionError) {
        return Left(NetworkFailure(
          message: '서버에 연결할 수 없습니다.',
          code: 'CONNECTION_ERROR',
          originalError: e,
        ));
      } else {
        return Left(ServerFailure(
          message: e.response?.data['message'] ?? '서버 오류가 발생했습니다.',
          code: e.response?.statusCode?.toString(),
          originalError: e,
        ));
      }
    } catch (e) {
      return Left(UnknownFailure(
        message: '알 수 없는 오류가 발생했습니다.',
        originalError: e,
      ));
    }
  }

  bool _isValidEmail(String email) {
    final emailRegex = RegExp(
      r'^[a-zA-Z0-9.]+@[a-zA-Z0-9]+\.[a-zA-Z]+',
    );
    return emailRegex.hasMatch(email);
  }
}