// Path: src/main/java/me/hao0/wechat/loader/AccessTokenLoader.java
// public interface AccessTokenLoader {
// 
//     /**
//      * 获取accessToken
//      * @return accessToken，""或NULL会重新从微信服务器获取，并进行refresh
//      */
//     String get();
// 
//     /**
//      * 刷新accessToken，实现时需要保存一段时间，以免频繁从微信服务器获取
//      * @param token 从微信服务器获取AccessToken
//      */
//     void refresh(AccessToken token);
// }
// 
// Path: src/main/java/me/hao0/wechat/loader/TicketLoader.java
// public interface TicketLoader {
// 
//     /**
//      * 获取Ticket
//      * @param type ticket类型
//      *             @see me.hao0.wechat.model.js.TicketType
//      * @return 有效的ticket，若返回""或null，则触发重新从微信请求Ticket的方法refresh
//      */
//     String get(TicketType type);
// 
//     /**
//      * 刷新Ticket
//      * @param ticket 最新获取到的Ticket
//      */
//     void refresh(Ticket ticket);
// }


import me.hao0.wechat.loader.AccessTokenLoader;
import me.hao0.wechat.loader.TicketLoader;
import java.util.concurrent.ExecutorService;
import static me.hao0.common.util.Preconditions.*;
package me.hao0.wechat.core;


/**
 * 微信组件库配置构建器
 * Author: haolin
 * Email: haolin.h0@gmail.com
 * Date: 14/11/15
 * @since 1.4.0
 */
public final class WechatBuilder {

    private Wechat wechat;

    /**
     * 创建一个WechatBuilder
     * @param appId 微信appId
     * @param appSecret 微信appSecret
     * @return a builder
     */
    public static WechatBuilder newBuilder(String appId, String appSecret){
        checkNotNullAndEmpty(appId, "appId");
        checkNotNullAndEmpty(appSecret, "appSecret");

        WechatBuilder builder = new WechatBuilder();
        builder.wechat = new Wechat(appId, appSecret);
        return builder;
    }

    /**
     * 配置微信APP令牌(Token)
     * @param token 微信APP令牌(Token)
     * @return this
     */
    public WechatBuilder token(String token){
        checkNotNullAndEmpty(token, "token");
        wechat.appToken = token;
        return this;
    }

    /**
     * 配置加密消息的Key
     * @param msgKey 加密消息的Key
     * @return this
     */
    public WechatBuilder msgKey(String msgKey){
        checkNotNullAndEmpty(msgKey, "msgKey");
        wechat.msgKey = msgKey;
        return this;
    }

    /**
     * 配置accessToken加载器
     * @param accessTokenLoader accessToken加载器
     * @return return this
     */
    public WechatBuilder accessTokenLoader(AccessTokenLoader accessTokenLoader){
        checkNotNull(accessTokenLoader, "accessTokenLoader can't be null");
        wechat.tokenLoader = accessTokenLoader;
        return this;
    }

    /**
     * 配置ticket加载器
     * @param ticketLoader ticket加载器
     * @return this
     */
// Path: src/main/java/me/hao0/wechat/loader/AccessTokenLoader.java
// public interface AccessTokenLoader {
// 
//     /**
//      * 获取accessToken
//      * @return accessToken，""或NULL会重新从微信服务器获取，并进行refresh
//      */
//     String get();
// 
//     /**
//      * 刷新accessToken，实现时需要保存一段时间，以免频繁从微信服务器获取
//      * @param token 从微信服务器获取AccessToken
//      */
//     void refresh(AccessToken token);
// }
// 
// Path: src/main/java/me/hao0/wechat/loader/TicketLoader.java
// public interface TicketLoader {
// 
//     /**
//      * 获取Ticket
//      * @param type ticket类型
//      *             @see me.hao0.wechat.model.js.TicketType
//      * @return 有效的ticket，若返回""或null，则触发重新从微信请求Ticket的方法refresh
//      */
//     String get(TicketType type);
// 
//     /**
//      * 刷新Ticket
//      * @param ticket 最新获取到的Ticket
//      */
//     void refresh(Ticket ticket);
// }


// Path: src/main/java/me/hao0/wechat/core/WechatBuilder.java
import me.hao0.wechat.loader.AccessTokenLoader;
import me.hao0.wechat.loader.TicketLoader;
import java.util.concurrent.ExecutorService;
import static me.hao0.common.util.Preconditions.*;

package me.hao0.wechat.core;


/**
 * 微信组件库配置构建器
 * Author: haolin
 * Email: haolin.h0@gmail.com
 * Date: 14/11/15
 * @since 1.4.0
 */
public final class WechatBuilder {

    private Wechat wechat;

    /**
     * 创建一个WechatBuilder
     * @param appId 微信appId
     * @param appSecret 微信appSecret
     * @return a builder
     */
    public static WechatBuilder newBuilder(String appId, String appSecret){
        checkNotNullAndEmpty(appId, "appId");
        checkNotNullAndEmpty(appSecret, "appSecret");

        WechatBuilder builder = new WechatBuilder();
        builder.wechat = new Wechat(appId, appSecret);
        return builder;
    }

    /**
     * 配置微信APP令牌(Token)
     * @param token 微信APP令牌(Token)
     * @return this
     */
    public WechatBuilder token(String token){
        checkNotNullAndEmpty(token, "token");
        wechat.appToken = token;
        return this;
    }

    /**
     * 配置加密消息的Key
     * @param msgKey 加密消息的Key
     * @return this
     */
    public WechatBuilder msgKey(String msgKey){
        checkNotNullAndEmpty(msgKey, "msgKey");
        wechat.msgKey = msgKey;
        return this;
    }

    /**
     * 配置accessToken加载器
     * @param accessTokenLoader accessToken加载器
     * @return return this
     */
    public WechatBuilder accessTokenLoader(AccessTokenLoader accessTokenLoader){
        checkNotNull(accessTokenLoader, "accessTokenLoader can't be null");
        wechat.tokenLoader = accessTokenLoader;
        return this;
    }

    /**
     * 配置ticket加载器
     * @param ticketLoader ticket加载器
     * @return this
     */
    public WechatBuilder ticketLoader(TicketLoader ticketLoader){