import 'package:dio/dio.dart';
import '../../core/error/exceptions.dart';
import '../../core/network/api_client.dart';
import '../dto/login_dto.dart';
import '../dto/login_response_dto.dart';
import '../dto/change_password_request_dto.dart';
import '../dto/change_password_response_dto.dart';

abstract class AuthRemoteDataSource {
  Future<LoginResponseDto> login(LoginDto dto);
  Future<ChangePasswordResponseDto> changePassword(
    ChangePasswordRequestDto dto,
  );
}

class AuthRemoteDataSourceImpl implements AuthRemoteDataSource {
  final ApiClient apiClient;

  AuthRemoteDataSourceImpl({required this.apiClient});

  @override
  Future<LoginResponseDto> login(LoginDto dto) async {
    try {
      final response = await apiClient.post('/Auth/login', data: dto.toJson());

      if (response.statusCode == 200 || response.statusCode == 201) {
        final responseData = response.data;

        if (responseData is Map<String, dynamic>) {
          return LoginResponseDto.fromJson(responseData);
        } else {
          throw ServerException(
            message: 'استجابة غير صحيحة من الخادم',
            statusCode: response.statusCode,
          );
        }
      } else {
        throw ServerException(
          message: 'فشل تسجيل الدخول',
          statusCode: response.statusCode,
        );
      }
    } on DioException catch (e) {
      if (e.type == DioExceptionType.connectionTimeout ||
          e.type == DioExceptionType.receiveTimeout) {
        throw NetworkException(message: 'انتهت مهلة الاتصال');
      } else if (e.type == DioExceptionType.connectionError) {
        throw NetworkException(message: 'لا يوجد اتصال بالانترنيت');
      } else if (e.response?.statusCode == 500) {
        throw ServerException(message: 'خطأ في الخادم يرجى المحاولة لاحقا');
      } else if (e.response != null) {
        final message =
            e.response?.data?['message'] ??
            e.response?.data?['error'] ??
            'فشل تسجيل الدخول';

        // Check for invalid credentials
        final customMessage =
            message.toString().toLowerCase().contains('invalid') ||
                    message.toString().toLowerCase().contains('incorrect')
                ? 'رقم الهاتف أو كلمة المرور غير صحيحة'
                : message.toString().toLowerCase().contains('not found')
                ? 'المستخدم غير موجود'
                : message;

        throw ServerException(
          message: customMessage,
          statusCode: e.response?.statusCode,
        );
      } else {
        throw NetworkException(message: 'خطأ في الانترنيت يرجى المحاولة لاحقا');
      }
    } catch (e) {
      if (e is ServerException || e is NetworkException) {
        rethrow;
      }
      throw ServerException(message: 'خطأ غير متوقع');
    }
  }

  @override
  Future<ChangePasswordResponseDto> changePassword(
    ChangePasswordRequestDto dto,
  ) async {
    try {
      final response = await apiClient.post(
        '/Auth/change-password',
        data: dto.toJson(),
      );

      if (response.statusCode == 200) {
        return ChangePasswordResponseDto.fromJson(response.data);
      } else {
        throw ServerException(
          message: response.data['message'] ?? 'فشل تغيير كلمة المرور',
          statusCode: response.statusCode,
        );
      }
    } on DioException catch (e) {
      final message =
          e.response?.data?['message'] ??
          e.response?.data?['error'] ??
          'فشل تغيير كلمة المرور';
      throw ServerException(
        message: message,
        statusCode: e.response?.statusCode,
      );
    } catch (e) {
      if (e is ServerException) rethrow;
      throw ServerException(message: 'خطأ غير متوقع: $e');
    }
  }
}
