package top.octopusyan.http;

import okhttp3.OkHttpClient;
import top.octopusyan.http.config.ILogStrategy;
import top.octopusyan.http.request.IRequestHandler;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

/**
 * @author : octopus yan
 * @email : octopus_yan@foxmail.com
 * @description : http 设置
 * @create : 2022-4-1 15:44
 */
public class HttpConfig {

    private static volatile HttpConfig sConfig;

    /** 服务器地址 */
    private String serverPath;

    /** 请求处理器 */
    private IRequestHandler mHandler;

    /** 日志打印策略 */
    private ILogStrategy mLogStrategy;

    /** OkHttp 客户端 */
    private OkHttpClient mClient;

    /** 通用参数 */
    private HashMap<String, Object> mParams;
    /** 通用请求头 */
    private HashMap<String, String> mHeaders;

    /** 日志开关 */
    private boolean mLogEnabled = true;
    /** 日志 TAG */
    private String mLogTag = "EasyHttp";

    /** 重试次数 */
    private int mRetryCount;
    /** 重试时间 */
    private long mRetryTime = 2000;

    private HttpConfig(OkHttpClient client) {
        mClient = client;
        mParams = new HashMap<>();
        mHeaders = new HashMap<>();
    }
    private HttpConfig() {
        mParams = new HashMap<>();
        mHeaders = new HashMap<>();
        initHttpClient();
    }

    public static HttpConfig getInstance() {
        if (sConfig == null) {
            // 当前没有初始化配置
            throw new IllegalStateException("You haven't initialized the configuration yet");
        }
        return sConfig;
    }

    private static void setInstance(HttpConfig config) {
        sConfig = config;
    }

    public static HttpConfig with(OkHttpClient client) {
        return new HttpConfig(client);
    }

    /**
     * 无参初始化 默认配置生成 okhttpclient
     */
    public static HttpConfig init() {
        return new HttpConfig();
    }

    public HttpConfig setParams(HashMap<String, Object> params) {
        if (params == null) {
            params = new HashMap<>();
        }
        mParams = params;
        return this;
    }

    public HttpConfig setHeaders(HashMap<String, String> headers) {
        if (headers == null) {
            headers = new HashMap<>();
        }
        mHeaders = headers;
        return this;
    }

    public HashMap<String, Object> getParams() {
        return mParams;
    }

    public HashMap<String, String> getHeaders() {
        return mHeaders;
    }

    public HttpConfig addHeader(String key, String value) {
        if (key != null && value != null) {
            mHeaders.put(key, value);
        }
        return this;
    }

    public HttpConfig addParam(String key, String value) {
        if (key != null && value != null) {
            mParams.put(key, value);
        }
        return this;
    }

    public OkHttpClient getClient() {
        return mClient;
    }

    public HttpConfig setLogStrategy(ILogStrategy strategy) {
        mLogStrategy = strategy;
        return this;
    }

    public HttpConfig setLogEnabled(boolean enabled) {
        mLogEnabled = enabled;
        return this;
    }

    public HttpConfig setLogTag(String tag) {
        mLogTag = tag;
        return this;
    }

    public HttpConfig setHandler(IRequestHandler mHandler) {
        this.mHandler = mHandler;
        return this;
    }

    public HttpConfig setRetryCount(int count) {
        if (count < 0) {
            // 重试次数必须大于等于 0 次
            throw new IllegalArgumentException("The number of retries must be greater than 0");
        }
        mRetryCount = count;
        return this;
    }

    public HttpConfig serverPath(String serverPath) {
        this.serverPath = serverPath;
        return this;
    }

    public HttpConfig setRetryTime(long time) {
        if (time < 0) {
            // 重试时间必须大于等于 0 毫秒
            throw new IllegalArgumentException("The retry time must be greater than 0");
        }
        mRetryTime = time;
        return this;
    }

    public ILogStrategy getLogStrategy() {
        return mLogStrategy;
    }

    public boolean isLogEnabled() {
        return mLogEnabled && mLogStrategy != null;
    }

    public String getLogTag() {
        return mLogTag;
    }

    public int getRetryCount() {
        return mRetryCount;
    }

    public long getRetryTime() {
        return mRetryTime;
    }

    public String getServerPath() {
        return serverPath;
    }

    public IRequestHandler getHandler() {
        return mHandler;
    }

    public void into() {
        if (mClient == null)
            throw new IllegalArgumentException("The OkHttp client object cannot be empty");

        try {
            // 校验主机和路径的 url 是否合法
            new URL(serverPath);
        } catch (MalformedURLException e) {
            throw new IllegalArgumentException("The configured host path url address is not correct");
        }

        HttpConfig.setInstance(this);
    }

    private void initHttpClient() {

    }
}
