package com.asana.errors;

import com.asana.Json;
import com.asana.models.ErrorBody;
import com.google.api.client.http.HttpResponseException;
import com.google.api.client.repackaged.com.google.common.base.Joiner;

import java.io.IOException;

public class AsanaError extends IOException {
    public int status;
    public HttpResponseException response;

    public AsanaError(String message, int status, HttpResponseException exception) {
        super(constructMessage(message, exception));

        this.status = status;
        this.response = exception;
    }

    public static AsanaError mapException(HttpResponseException exception) throws AsanaError {
        switch (exception.getStatusCode()) {
            case ForbiddenError.STATUS:
                return new ForbiddenError(exception);
            case InvalidRequestError.STATUS:
                return new InvalidRequestError(exception);
            case InvalidTokenError.STATUS:
                return new InvalidTokenError(exception);
            case NoAuthorizationError.STATUS:
                return new NoAuthorizationError(exception);
            case NotFoundError.STATUS:
                return new NotFoundError(exception);
            case PremiumOnlyError.STATUS:
                return new PremiumOnlyError(exception);
            case RateLimitEnforcedError.STATUS:
                return new RateLimitEnforcedError(exception);
            case ServerError.STATUS:
                return new ServerError(exception);
            default:
                return new AsanaError(exception.getStatusMessage(), exception.getStatusCode(), exception);
        }
    }

    private static String constructMessage(String message, HttpResponseException exception) {
        try {
            ErrorBody body = Json.getInstance().fromJson(exception.getContent(), ErrorBody.class);
            if (body.errors.size() > 0) {
                return message + " (" + Joiner.on("; ").join(body.errors) + ")";
            }
        } catch (Exception e) {
        }
        return message;
    }
}