package mobvista.dmp.datasource.baichuan;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import mobvista.dmp.util.PropertyUtil;
import org.apache.http.Consts;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

/**
 * @package: mobvista.dmp.datasource.baichuan
 * @author: wangjf
 * @date: 2019-08-26
 * @time: 15:44
 * @email: jinfeng.wang@mobvista.com
 * @phone: 152-1062-7698
 */

public class BaiChuanServerV2 {

    private static String serverUrl = PropertyUtil.getProperty("config.properties", "dsp.taobao.server.url");
    private static String channel = PropertyUtil.getProperty("config.properties", "dsp.taobao.server.channel");
    private static String adid = PropertyUtil.getProperty("config.properties", "dsp.taobao.server.adid");

    public static JSONObject request(Logger logger, AsoDevice asoDevice, int appOs) throws NoSuchAlgorithmException, KeyManagementException {
        SSLUtil.turnOffSsl();
        CloseableHttpClient client = HttpClients.createDefault();
        List<BasicNameValuePair> formparams = new ArrayList<>();
        formparams.add(new BasicNameValuePair("channel", channel));
        formparams.add(new BasicNameValuePair("adid", adid));
        if (appOs == 1) {
            formparams.add(new BasicNameValuePair("imei", asoDevice.getDeviceId()));
        } else if (appOs == 2) {
            formparams.add(new BasicNameValuePair("idfa", asoDevice.getDeviceId()));
        } else {
            formparams.add(new BasicNameValuePair("imeiMd5", asoDevice.getDeviceId()));
        }

        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);

        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(1000).setConnectionRequestTimeout(1000)
                .setSocketTimeout(1000).build();
        HttpPost post = new HttpPost(serverUrl);
        JSONObject jsonObject = new JSONObject();
        CloseableHttpResponse response;
        try {
            post.setConfig(requestConfig);
            post.setEntity(entity);
            response = client.execute(post);
            BufferedReader rd = new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent()));
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
            jsonObject = JSON.parseObject(result.toString());
        } catch (Exception e) {
            jsonObject.put("result", true);
        } finally {
            post.abort();
        }
        return jsonObject;
    }

    public static void main(String[] args) throws JoranException {

        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(context);
        context.reset();
        configurator.doConfigure(BaiChuanServer.class.getClassLoader().getResourceAsStream("logback-syslog.xml"));
        Logger logger = context.getLogger("baichuan");

        /*
        String[] deviceIds = {"7E6C6738-9911-4F2A-9A3F-38CA18E93A48", "7E6C7D96-5738-4034-B3B6-C34AB262F09F", "7E6C9685-2A81-49D8-98B7-63EE23911310", "7E6CA0FF-2795-48E1-AABE-F772F3F96DF9",
                "7E6CB2C7-F793-4D45-9FD5-51545BFCD2A6", "7E6CC03D-84DB-44DA-84AF-90D654B09B18", "7E6CC45B-671E-4D5F-9E45-3710E3F26C04", "7E6CC640-F0A6-4E60-8DC8-3ADD2E294DB8", "7E6CF4A0-BC05-4F2B-B8B0-E01FA030441C",
                "7E6D1661-DF63-43C5-B686-4E1366E3168F"};
        String[] deviceIds = {"7469d0a9beeaf02a640b786777a5d7b3", "0f2dfff5f1a5a8a9ee7a1f64004e7f80", "fcc82d399a68bc3f34baac90eeb8bc52", "48be8c3d0364abd1efcc7ddb584e4dcf",
                "85299e58bd8038c340d8f4e3c513bbbe", "99a61b76692427b174b35af965525b45", "549dc723069ce38adbcb14eb1656bf56"};


        String[] deviceIds = {"863388035513055", "867771030124950", "866939037784479", "355085080884135", "866250038018309", "867676035339877", "865631037762776", "863894032393417", "868874033544924", "868917034034013", "253057267226036"};
        */
        String[] deviceIds = {"D280F1BD-C32E-4AAD-B3CD-E1D1EAAA7E1F",
                "F181E87C-9E4B-4CD5-81C9-AD64B9BD1A7B",
                "73073946-20B9-4804-A106-6193F89FA763",
                "8CA22FCA-A244-42F3-894A-331781876E04",
                "EF036591-55CB-4F90-8949-A8698BEC410C",
                "8E668447-521B-4ABA-AAB2-C4B3B32C8CFB",
                "9A230116-EEF2-4B7D-BD89-87B53D1215BC",
                "9ECBAE40-FAB8-4C23-B574-F373BA24C58B",
                "C9CD4B81-43A2-4672-8809-1035E3AA3947"};

        /**
         * 因百川并发限制,设置总线程数为 200
         */
        /*
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
                .setNameFormat("ali-%d").build();
        ExecutorService aliPool = new ThreadPoolExecutor(10, 10,
                120L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
        //  CloseableHttpClient client = HttpClients.createDefault();
        for (int reqId = 0; reqId < 7; reqId++) {
            int finalReqId = reqId;
            aliPool.execute(() -> {
                //  runJob(finalIpId, map.get(finalReqId));
                try {
                    Random random = new Random();
                    KV kv = new KV();
                    String deviceId = deviceIds[random.nextInt(7)];
                    kv.setDeviceId(deviceId);
                    kv.setAppOs(1);
                    JsonObject jsonObject = request(logger, serverUrl, channel, adid, kv);
                    logger.info(deviceId + "  ===  " + jsonObject.toString());
                    Thread.sleep(200);
                } catch (InterruptedException | NoSuchAlgorithmException | KeyManagementException e) {
                    e.printStackTrace();
                }
            });
        }
        aliPool.shutdown();
        */
        //  Set<String> deviceSet = new HashSet<>();
        for (String deviceId : deviceIds) {
            //  deviceSet.add(deviceId);
            //  AsoDevice asoDevice = BaiChuanMainV2.returnClass("2", "1", deviceId);
            //  JSONObject jsonObject = BaiChuanServerV2.request(logger, asoDevice, 1);
            //  System.out.println(jsonObject);
        }
        /*
        try {
            AlibabaBaichuanAsoQueryResponse rsp = AliServer.asoRequest("2", "2", deviceSet);
            if (rsp != null && rsp.getResult() != null && rsp.getResult().getSuccess()) {
                for (AlibabaBaichuanAsoQueryResponse.AsoDeviceCheckResult checkResult : rsp.getResult().getResults()) {
                    AsoDevice asoDevice = new AsoDevice();
                    System.out.println(checkResult.getIsNewDevice());
                }
            }
        } catch (ApiException e) {
            e.printStackTrace();
        }
        */
    }
}