package com.zztrapp.zztrapp.download;


import com.zztrapp.zztrapp.utilcode.util.SPUtils;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ProjectName: TIMSDK
 * @ClassName: OkhttpUtil
 * @Author: Bby
 * @CreateDate: 2021/11/20
 * @Description: 网络请求工具类
 */
public class TOkhttpUtil {

    public static final String METHOD_GET = "GET";

    public static final String METHOD_POST = "POST";

    public static final String METHOD_PUT = "PUT";

    public static final String METHOD_DELETE = "DELETE";

    public static final String FILE_TYPE_FILE = "file/*";

    public static final String FILE_TYPE_IMAGE = "image/*";

    public static final String FILE_TYPE_AUDIO = "audio/*";

    public static final String FILE_TYPE_VIDEO = "video/*";

    public static final String OCTET_STREAM = "application/octet-stream";

    /**
     * get请求
     *
     * @param url：url
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpGet(String url, TCallBackUtil callBack) {

        okHttpGet(url, null, null, callBack);

    }


    /**
     * get请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpGet(String url, Map<String, String> paramsMap, TCallBackUtil callBack) {

        okHttpGet(url, paramsMap, null, callBack);

    }


    /**
     * get请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpGet(String url, Map<String, String> paramsMap, Map<String, String> headerMap, TCallBackUtil callBack) {

        new TRequestUtil(METHOD_GET, url, paramsMap, headerMap, callBack).execute();

    }


    /**
     * post请求
     *
     * @param url：url
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPost(String url, TCallBackUtil callBack) {

        okHttpPost(url, null, callBack);

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPost(String url, Map<String, String> paramsMap, TCallBackUtil callBack) {

        Map<String, String> headerMap = generateCommonHeader(null);

        okHttpPost(url, paramsMap, headerMap, callBack);

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPost(String url, Map<String, String> paramsMap, Map<String, String> headerMap, TCallBackUtil callBack) {

        new TRequestUtil(METHOD_POST, url, paramsMap, headerMap, callBack).execute();

    }

    /**
     * post请求
     *
     * @param url：url
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPut(String url, TCallBackUtil callBack) {

        okHttpPut(url, null, callBack);

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPut(String url, Map<String, String> paramsMap, TCallBackUtil callBack) {

        okHttpPut(url, paramsMap, null, callBack);

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPut(String url, Map<String, String> paramsMap, Map<String, String> headerMap, TCallBackUtil callBack) {

        new TRequestUtil(METHOD_PUT, url, paramsMap, headerMap, callBack).execute();

    }

    /**
     * post请求
     *
     * @param url：url
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpDelete(String url, TCallBackUtil callBack) {

        okHttpDelete(url, null, callBack);

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpDelete(String url, Map<String, String> paramsMap, TCallBackUtil callBack) {

        okHttpDelete(url, paramsMap, null, callBack);

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param paramsMap：map集合，封装键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpDelete(String url, Map<String, String> paramsMap, Map<String, String> headerMap, TCallBackUtil callBack) {

        new TRequestUtil(METHOD_DELETE, url, paramsMap, headerMap, callBack).execute();

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param jsonStr：json格式的键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPostJson(String url, String jsonStr, TCallBackUtil callBack) {

        okHttpPostJson(url, jsonStr, null, callBack);

    }


    /**
     * post请求，可以传递参数
     *
     * @param url：url
     * @param jsonStr：json格式的键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpPostJson(String url, String jsonStr, Map<String, String> headerMap, TCallBackUtil callBack) {
        headerMap = generateCommonHeader(headerMap);
        new TRequestUtil(METHOD_POST, url, jsonStr, headerMap, callBack).execute();
    }


    /**
     * post请求，上传单个文件
     *
     * @param url：url
     * @param file：File对象
     * @param fileKey：上传参数时file对应的键
     * @param fileType：File类型，是image，video，audio，file
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。还可以重写onProgress方法，得到上传进度
     */

    public static void okHttpUploadFile(String url, File file, String fileKey, String fileType, TCallBackUtil callBack) {

        okHttpUploadFile(url, file, fileKey, fileType, null, callBack);

    }


    /**
     * post请求，上传单个文件
     *
     * @param url：url
     * @param file：File对象
     * @param fileKey：上传参数时file对应的键
     * @param fileType：File类型，是image，video，audio，file
     * @param paramsMap：map集合，封装键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。还可以重写onProgress方法，得到上传进度
     */

    public static void okHttpUploadFile(String url, File file, String fileKey, String fileType, Map<String, String> paramsMap, TCallBackUtil callBack) {

        okHttpUploadFile(url, file, fileKey, fileType, paramsMap, null, callBack);

    }


    /**
     * post请求，上传单个文件
     *
     * @param url：url
     * @param file：File对象
     * @param fileKey：上传参数时file对应的键
     * @param fileType：File类型，是image，video，audio，file
     * @param paramsMap：map集合，封装键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。还可以重写onProgress方法，得到上传进度
     */

    public static void okHttpUploadFile(String url, File file, String fileKey, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, TCallBackUtil callBack) {

        new TRequestUtil(METHOD_POST, url, paramsMap, file, fileKey, fileType, headerMap, callBack).execute();

    }


    /**
     * post请求，上传多个文件，以list集合的形式
     *
     * @param url：url
     * @param fileList：集合元素是File对象
     * @param fileKey：上传参数时fileList对应的键
     * @param fileType：File类型，是image，video，audio，file
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpUploadListFile(String url, List<File> fileList, String fileKey, String fileType, TCallBackUtil callBack) {

        okHttpUploadListFile(url, null, fileList, fileKey, fileType, callBack);

    }


    /**
     * post请求，上传多个文件，以list集合的形式
     *
     * @param url：url
     * @param fileList：集合元素是File对象
     * @param fileKey：上传参数时fileList对应的键
     * @param fileType：File类型，是image，video，audio，file
     * @param paramsMap：map集合，封装键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpUploadListFile(String url, Map<String, String> paramsMap, List<File> fileList, String fileKey, String fileType, TCallBackUtil callBack) {

        okHttpUploadListFile(url, paramsMap, fileList, fileKey, fileType, null, callBack);

    }


    /**
     * post请求，上传多个文件，以list集合的形式
     *
     * @param url：url
     * @param fileList：集合元素是File对象
     * @param fileKey：上传参数时fileList对应的键
     * @param fileType：File类型，是image，video，audio，file
     * @param paramsMap：map集合，封装键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpUploadListFile(String url, Map<String, String> paramsMap, List<File> fileList, String fileKey, String fileType, Map<String, String> headerMap, TCallBackUtil callBack) {

        new TRequestUtil(METHOD_POST, url, paramsMap, fileList, fileKey, fileType, headerMap, callBack).execute();

    }


    /**
     * post请求，上传多个文件，以map集合的形式
     *
     * @param url：url
     * @param fileMap：集合key是File对象对应的键，集合value是File对象
     * @param fileType：File类型，是image，video，audio，file
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, TCallBackUtil callBack) {

        okHttpUploadMapFile(url, fileMap, fileType, null, callBack);

    }


    /**
     * post请求，上传多个文件，以map集合的形式
     *
     * @param url：url
     * @param fileMap：集合key是File对象对应的键，集合value是File对象
     * @param fileType：File类型，是image，video，audio，file
     * @param paramsMap：map集合，封装键值对参数
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, TCallBackUtil callBack) {

        // : 2020/7/24  新增公共请求头
        Map<String, String> headMap = generateCommonHeader(null);

        okHttpUploadMapFile(url, fileMap, fileType, paramsMap, headMap, callBack);

    }


    /**
     * post请求，上传多个文件，以map集合的形式
     *
     * @param url：url
     * @param fileMap：集合key是File对象对应的键，集合value是File对象
     * @param fileType：File类型，是image，video，audio，file
     * @param paramsMap：map集合，封装键值对参数
     * @param headerMap：map集合，封装请求头键值对
     * @param callBack：回调接口，onFailure方法在请求失败时调用，onResponse方法在请求成功后调用，这两个方法都执行在UI线程。
     */

    public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, TCallBackUtil callBack) {

        new TRequestUtil(METHOD_POST, url, paramsMap, fileMap, fileType, headerMap, callBack).execute();

    }


    /**
     * 下载文件,不带参数
     */

    public static void okHttpDownloadFile(String url, TCallBackUtil.TCallBackFile callBack) {

        okHttpDownloadFile(url, null, callBack);

    }


    /**
     * 下载文件,带参数
     */

    public static void okHttpDownloadFile(String url, Map<String, String> paramsMap, TCallBackUtil.TCallBackFile callBack) {
        HashMap<String, String> headerMap = new HashMap<>();
        String authorization = SPUtils.getInstance().getString("authorization", "");

        headerMap.put("X-Access-Token", authorization);
        okHttpGet(url, paramsMap, headerMap, callBack);

    }

    /**
     * 加载图片
     */

    public static void okHttpGetBitmap(String url, TCallBackUtil.TCallBackBitmap callBack) {

        okHttpGetBitmap(url, null, callBack);

    }

    /**
     * 加载图片，带参数
     */

    public static void okHttpGetBitmap(String url, Map<String, String> paramsMap, TCallBackUtil.TCallBackBitmap callBack) {

        okHttpGet(url, paramsMap, null, callBack);

    }


    /**
     * 添加公共请求头
     *
     * @param headMap 原有请求头
     * @return 新增后的请求头
     */
    public static Map<String, String> generateCommonHeader(Map<String, String> headMap) {
        if (headMap == null) {
            headMap = new HashMap<>();
        }
        headMap.put("X-APPLICATION-ID", "MGS-IM");
        headMap.put("appTenantId", "IM1");
        headMap.put("departmentId", "IM2");

        return headMap;
    }


}
