/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.camel.component.twitter;

import org.apache.camel.component.twitter.data.EndpointType;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.util.ObjectHelper;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;

@UriParams
public class TwitterConfiguration {

    @UriParam(label = "consumer", defaultValue = "polling", enums = "polling,direct,event")
    private EndpointType type = EndpointType.POLLING;
    @UriParam(label = "security", secret = true)
    private String accessToken;
    @UriParam(label = "security", secret = true)
    private String accessTokenSecret;
    @UriParam(label = "security", secret = true)
    private String consumerKey;
    @UriParam(label = "security", secret = true)
    private String consumerSecret;
    @UriParam(label = "consumer,filter")
    private String userIds;
    @UriParam(label = "consumer,filter", defaultValue = "true")
    private boolean filterOld = true;
    @UriParam(label = "consumer,filter", defaultValue = "1")
    private long sinceId  = 1;
    @UriParam(label = "consumer,filter")
    private String lang;
    @UriParam(label = "consumer,filter", defaultValue = "5")
    private Integer count = 5;
    @UriParam(label = "consumer,filter", defaultValue = "1")
    private Integer numberOfPages = 1;
    @UriParam(label = "consumer,sort", defaultValue = "true")
    private boolean sortById = true;
    @UriParam(label = "proxy")
    private String httpProxyHost;
    @UriParam(label = "proxy")
    private String httpProxyUser;
    @UriParam(label = "proxy")
    private String httpProxyPassword;
    @UriParam(label = "proxy")
    private Integer httpProxyPort;
    @UriParam(label = "consumer,advanced")
    private String locations;
    @UriParam(label = "consumer,advanced")
    private Double latitude;
    @UriParam(label = "consumer,advanced")
    private Double longitude;
    @UriParam(label = "consumer,advanced")
    private Double radius;
    @UriParam(label = "consumer,advanced", defaultValue = "km", enums = "km,mi")
    private String distanceMetric;
    @UriParam(label = "consumer,advanced", defaultValue = "true")
    private boolean extendedMode = true;

    /**
     * Singleton, on demand instances of Twitter4J's Twitter & TwitterStream.
     * This should not be created by an endpoint's doStart(), etc., since
     * instances of twitter and/or twitterStream can be supplied by the route
     * itself.  Further, as an example, we don't want to initialize twitter
     * if we only need twitterStream.
     */
    private Twitter twitter;

    @UriParam(label = "consumer,advanced")
    private TwitterStream twitterStream;

    /**
     * Ensures required fields are available.
     */
    public void checkComplete() {
        if (twitter == null && twitterStream == null
                && (ObjectHelper.isEmpty(consumerKey) || ObjectHelper.isEmpty(consumerSecret) || ObjectHelper.isEmpty(accessToken) ||  ObjectHelper.isEmpty(accessTokenSecret))) {
            throw new IllegalArgumentException("twitter or twitterStream or all of consumerKey, consumerSecret, accessToken, and accessTokenSecret must be set!");
        }
    }

    /**
     * Builds a Twitter4J Configuration using the OAuth params.
     *
     * @return Configuration
     */
    public Configuration getConfiguration() {
        checkComplete();
        ConfigurationBuilder confBuilder = new ConfigurationBuilder();
        confBuilder.setOAuthConsumerKey(consumerKey);
        confBuilder.setOAuthConsumerSecret(consumerSecret);
        confBuilder.setOAuthAccessToken(accessToken);
        confBuilder.setOAuthAccessTokenSecret(accessTokenSecret);
        confBuilder.setTweetModeExtended(isExtendedMode());
        if (getHttpProxyHost() != null) {
            confBuilder.setHttpProxyHost(getHttpProxyHost());
        }
        if (getHttpProxyUser() != null) {
            confBuilder.setHttpProxyUser(getHttpProxyUser());
        }
        if (getHttpProxyPassword() != null) {
            confBuilder.setHttpProxyPassword(getHttpProxyPassword());
        }
        if (httpProxyPort != null) {
            confBuilder.setHttpProxyPort(httpProxyPort);
        }

        return confBuilder.build();
    }

    public Twitter getTwitter() {
        if (twitter == null) {
            twitter = new TwitterFactory(getConfiguration()).getInstance();
        }
        return twitter;
    }

    public void setTwitter(Twitter twitter) {
        this.twitter = twitter;
    }

    public TwitterStream getTwitterStream() {
        return twitterStream;
    }

    /**
     * To use a custom instance of TwitterStream
     */
    public void setTwitterStream(TwitterStream twitterStream) {
        this.twitterStream = twitterStream;
    }

    public TwitterStream createTwitterStream() {
        if (twitterStream == null) {
            twitterStream = new TwitterStreamFactory(getConfiguration()).getInstance();
        }
        return twitterStream;
    }

    public String getConsumerKey() {
        return consumerKey;
    }

    /**
     * The consumer key. Can also be configured on the TwitterComponent level instead.
     */
    public void setConsumerKey(String consumerKey) {
        this.consumerKey = consumerKey;
    }

    public String getConsumerSecret() {
        return consumerSecret;
    }

    /**
     * The consumer secret. Can also be configured on the TwitterComponent level instead.
     */
    public void setConsumerSecret(String consumerSecret) {
        this.consumerSecret = consumerSecret;
    }

    /**
     * The access token. Can also be configured on the TwitterComponent level instead.
     */
    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    /**
     * The access secret. Can also be configured on the TwitterComponent level instead.
     */
    public String getAccessTokenSecret() {
        return accessTokenSecret;
    }

    public void setAccessTokenSecret(String accessTokenSecret) {
        this.accessTokenSecret = accessTokenSecret;
    }

    public EndpointType getType() {
        return type;
    }

    /**
     * Endpoint type to use. Only streaming supports event type.
     */
    public void setType(EndpointType type) {
        this.type = type;
    }

    public String getLocations() {
        return locations;
    }

    /**
     * Bounding boxes, created by pairs of lat/lons. Can be used for streaming/filter. A pair is defined as lat,lon. And multiple paris can be separated by semi colon.
     */
    public void setLocations(String locations) {
        this.locations = locations;
    }

    public String getUserIds() {
        return userIds;
    }

    /**
     * To filter by user ids for streaming/filter. Multiple values can be separated by comma.
     */
    public void setUserIds(String userIds) {
        this.userIds = userIds;
    }

    public boolean isFilterOld() {
        return filterOld;
    }

    /**
     * Filter out old tweets, that has previously been polled.
     * This state is stored in memory only, and based on last tweet id.
     */
    public void setFilterOld(boolean filterOld) {
        this.filterOld = filterOld;
    }

    public long getSinceId() {
        return sinceId;
    }

    /**
     * The last tweet id which will be used for pulling the tweets. It is useful when the camel route is restarted after a long running.
     */
    public void setSinceId(long sinceId) {
        this.sinceId = sinceId;
    }

    public String getLang() {
        return lang;
    }

    /**
     * The lang string ISO_639-1 which will be used for searching
     */
    public void setLang(String lang) {
        this.lang = lang;
    }

    public Integer getCount() {
        return count;
    }

    /**
     * Limiting number of results per page.
     */
    public void setCount(Integer count) {
        this.count = count;
    }

    public Integer getNumberOfPages() {
        return numberOfPages;
    }

    /**
     * The number of pages result which you want camel-twitter to consume.
     */
    public void setNumberOfPages(Integer numberOfPages) {
        this.numberOfPages = numberOfPages;
    }

    public boolean isSortById() {
        return sortById;
    }

    /**
     * Sorts by id, so the oldest are first, and newest last.
     */
    public void setSortById(boolean sortById) {
        this.sortById = sortById;
    }

    /**
     * The http proxy host which can be used for the camel-twitter. Can also be configured on the TwitterComponent level instead.
     */
    public void setHttpProxyHost(String httpProxyHost) {
        this.httpProxyHost = httpProxyHost;
    }

    public String getHttpProxyHost() {
        return httpProxyHost;
    }

    /**
     * The http proxy user which can be used for the camel-twitter. Can also be configured on the TwitterComponent level instead.
     */
    public void setHttpProxyUser(String httpProxyUser) {
        this.httpProxyUser = httpProxyUser;
    }

    public String getHttpProxyUser() {
        return httpProxyUser;
    }

    /**
     * The http proxy password which can be used for the camel-twitter. Can also be configured on the TwitterComponent level instead.
     */
    public void setHttpProxyPassword(String httpProxyPassword) {
        this.httpProxyPassword = httpProxyPassword;
    }

    public String getHttpProxyPassword() {
        return httpProxyPassword;
    }

    /**
     * The http proxy port which can be used for the camel-twitter. Can also be configured on the TwitterComponent level instead.
     */
    public void setHttpProxyPort(Integer httpProxyPort) {
        this.httpProxyPort = httpProxyPort;
    }

    public Integer getHttpProxyPort() {
        return httpProxyPort;
    }

    public Double getLongitude() {
        return longitude;
    }

    /**
     * Used by the non-stream geography search to search by longitude.
     * <p/>
     * You need to configure all the following options: longitude, latitude, radius, and distanceMetric.
     */
    public void setLongitude(Double longitude) {
        this.longitude = longitude;
    }

    public Double getLatitude() {
        return latitude;
    }

    /**
     * Used by the non-stream geography search to search by latitude.
     * <p/>
     * You need to configure all the following options: longitude, latitude, radius, and distanceMetric.
     */
    public void setLatitude(Double latitude) {
        this.latitude = latitude;
    }

    public Double getRadius() {
        return radius;
    }

    /**
     * Used by the non-stream geography search to search by radius.
     * <p/>
     * You need to configure all the following options: longitude, latitude, radius, and distanceMetric.
     */
    public void setRadius(Double radius) {
        this.radius = radius;
    }

    public String getDistanceMetric() {
        return distanceMetric;
    }

    /**
     * Used by the non-stream geography search, to search by radius using the configured metrics.
     * <p/>
     * The unit can either be mi for miles, or km for kilometers.
     * <p/>
     * You need to configure all the following options: longitude, latitude, radius, and distanceMetric.
     */
    public void setDistanceMetric(String distanceMetric) {
        this.distanceMetric = distanceMetric;
    }

    /**
     * Used for enabling full text from twitter (eg receive tweets that contains more than 140 characters).
     */
    public void setExtendedMode(Boolean extendedMode) {
        this.extendedMode = extendedMode;
    }

    public boolean isExtendedMode() {
        return extendedMode;
    }

}
