import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import '../../../services/auth_service.dart';
import '../../../data/models/auth/token_response.dart';
import '../../../core/errors/failures.dart';
import '../base_usecase.dart';

/// 토큰 갱신 UseCase
/// JWT 토큰을 갱신하여 세션 유지
class RefreshTokenUseCase extends UseCase<TokenResponse, NoParams> {
  final AuthService _authService;

  RefreshTokenUseCase(this._authService);

  @override
  Future<Either<Failure, TokenResponse>> call(NoParams params) async {
    try {
      final refreshToken = await _authService.getRefreshToken();
      
      if (refreshToken == null) {
        return Left(AuthFailure(
          message: '갱신 토큰이 없습니다. 다시 로그인해주세요.',
          code: 'NO_REFRESH_TOKEN',
        ));
      }

      return await _authService.refreshToken();
    } on DioException catch (e) {
      if (e.response?.statusCode == 401) {
        return Left(AuthFailure(
          message: '세션이 만료되었습니다. 다시 로그인해주세요.',
          code: 'SESSION_EXPIRED',
          originalError: e,
        ));
      } else if (e.type == DioExceptionType.connectionTimeout ||
                 e.type == DioExceptionType.receiveTimeout) {
        return Left(NetworkFailure(
          message: '네트워크 연결 시간이 초과되었습니다.',
          code: 'TIMEOUT',
          originalError: e,
        ));
      } else {
        return Left(ServerFailure(
          message: '서버 오류가 발생했습니다.',
          code: e.response?.statusCode?.toString(),
          originalError: e,
        ));
      }
    } catch (e) {
      return Left(UnknownFailure(
        message: '토큰 갱신 중 오류가 발생했습니다.',
        originalError: e,
      ));
    }
  }
}