package com.wuman.oauth.samples.instagram.api;

import com.google.api.client.googleapis.services.AbstractGoogleClientRequest;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;
import com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient;
import com.google.api.client.http.HttpMethods;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.util.Key;

import java.io.IOException;

public class Instagram extends AbstractGoogleJsonClient {

    public static final String DEFAULT_ROOT_URL = "https://api.instagram.com/";

    public static final String DEFAULT_SERVICE_PATH = "v1/";

    public static final String DEFAULT_BASE_URL = DEFAULT_ROOT_URL + DEFAULT_SERVICE_PATH;

    public Instagram(com.google.api.client.http.HttpTransport transport,
            com.google.api.client.json.JsonFactory jsonFactory,
            com.google.api.client.http.HttpRequestInitializer httpRequestInitializer) {
        this(new Builder(transport, jsonFactory, httpRequestInitializer));
    }

    Instagram(Builder builder) {
        super(builder);
    }

    @Override
    protected void initialize(AbstractGoogleClientRequest<?> httpClientRequest) throws IOException {
        super.initialize(httpClientRequest);
    }

    public Users users() {
        return new Users();
    }

    public class Users {

        public Self self() {
            return new Self();
        }

        public class Self {

            public FeedRequest feed() throws IOException {
                FeedRequest result = new FeedRequest();
                initialize(result);
                return result;
            }

            public class FeedRequest
                    extends
                    InstagramRequest<com.wuman.oauth.samples.instagram.api.model.Feed> {

                private static final String REST_PATH = "users/self/feed";

                @Key("count")
                private Integer count;

                @Key("min_id")
                private String minId;

                @Key("max_id")
                private String maxId;

                protected FeedRequest() {
                    super(Instagram.this,
                            HttpMethods.GET,
                            REST_PATH,
                            null,
                            com.wuman.oauth.samples.instagram.api.model.Feed.class);
                }

                public final FeedRequest setCount(Integer count) {
                    this.count = count;
                    return this;
                }

                public final FeedRequest setMinId(String minId) {
                    this.minId = minId;
                    return this;
                }

                public final FeedRequest setMaxId(String maxId) {
                    this.maxId = maxId;
                    return this;
                }

                @Override
                public FeedRequest setAccessToken(String accessToken) {
                    return (FeedRequest) super.setAccessToken(accessToken);
                }

                @Override
                public FeedRequest set(String fieldName, Object value) {
                    return (FeedRequest) super.set(fieldName, value);
                }

                @Override
                public HttpRequest buildHttpRequestUsingHead() throws IOException {
                    return super.buildHttpRequestUsingHead();
                }

                @Override
                public HttpResponse executeUsingHead() throws IOException {
                    return super.executeUsingHead();
                }

            }

        }

    }

    public static final class Builder extends
            com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient.Builder {

        public Builder(com.google.api.client.http.HttpTransport transport,
                com.google.api.client.json.JsonFactory jsonFactory,
                com.google.api.client.http.HttpRequestInitializer httpRequestInitializer) {
            super(transport,
                    jsonFactory,
                    DEFAULT_ROOT_URL,
                    DEFAULT_SERVICE_PATH,
                    httpRequestInitializer,
                    false);
        }

        @Override
        public Instagram build() {
            return new Instagram(this);
        }

        @Override
        public Builder setRootUrl(String rootUrl) {
            return (Builder) super.setRootUrl(rootUrl);
        }

        @Override
        public Builder setServicePath(String servicePath) {
            return (Builder) super.setServicePath(servicePath);
        }

        @Override
        public Builder setGoogleClientRequestInitializer(
                GoogleClientRequestInitializer googleClientRequestInitializer) {
            return (Builder) super
                    .setGoogleClientRequestInitializer(googleClientRequestInitializer);
        }

        @Override
        public Builder setHttpRequestInitializer(HttpRequestInitializer httpRequestInitializer) {
            return (Builder) super.setHttpRequestInitializer(httpRequestInitializer);
        }

        @Override
        public Builder setApplicationName(String applicationName) {
            return (Builder) super.setApplicationName(applicationName);
        }

        @Override
        public Builder setSuppressPatternChecks(boolean suppressPatternChecks) {
            return (Builder) super.setSuppressPatternChecks(suppressPatternChecks);
        }

        @Override
        public Builder setSuppressRequiredParameterChecks(boolean suppressRequiredParameterChecks) {
            return (Builder) super
                    .setSuppressRequiredParameterChecks(suppressRequiredParameterChecks);
        }

        @Override
        public Builder setSuppressAllChecks(boolean suppressAllChecks) {
            return (Builder) super.setSuppressAllChecks(suppressAllChecks);
        }

        public Builder setInstagramRequestInitializer(
                InstagramRequestInitializer instagramRequestInitializer) {
            return (Builder) super.setGoogleClientRequestInitializer(instagramRequestInitializer);
        }

    }
}