import 'package:dio/dio.dart';

abstract class Failure {
  final String errMessage;

  Failure(this.errMessage);
}

class ServerFailure extends Failure {
  ServerFailure(super.errMessage);

  @override
  String toString() {
    return errMessage;
  }

  factory ServerFailure.fromDioError(DioException dioError) {
    switch (dioError.type) {
      case DioExceptionType.connectionTimeout:
        return ServerFailure("Connection timeout with the Server.");
      case DioExceptionType.sendTimeout:
        return ServerFailure("Send timeout with the Server.");

      case DioExceptionType.receiveTimeout:
        return ServerFailure("Receive timeout with the Server.");

      case DioExceptionType.badCertificate:
        return ServerFailure("Bad certificate!");

      case DioExceptionType.badResponse:
        {
          // var document = parser.parse(dioError.response!.data.toString());
          // var message = document.body!.text;
          return ServerFailure.fromResponse(dioError.response!.statusCode!,
              dioError.response?.data['message'] ?? "Error");
        }
      case DioExceptionType.cancel:
        return ServerFailure("The request to ApiServer was canceled");

      case DioExceptionType.connectionError:
        return ServerFailure("No Internet Connection");

      case DioExceptionType.unknown:
        return ServerFailure("Unexpected Error, Please try again!");

      default:
        return ServerFailure("Unexpected Error, Please try again!");
    }
  }

  factory ServerFailure.fromResponse(int? statusCode, dynamic responseMessage) {
    switch (statusCode) {
      case 401:
      case 403:
        return ServerFailure(responseMessage);
      case 400:
        List<String> errors = [];
        if (responseMessage is List) {
          for (var error in responseMessage) {
            errors.add(error);
          }
        } else {
          return ServerFailure(responseMessage);
        }
        return ServerFailure(errors.join('\n'));
      case 404:
        return ServerFailure("");
      case 500:
        return ServerFailure(responseMessage);
      default:
        return ServerFailure("Opps there was an Error, Please try again!");
    }
  }
}
