package mobvista.dmp.datasource.rtdmp;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import mobvista.dmp.common.Constants;
import mobvista.dmp.util.MD5Util;
import mobvista.dmp.util.PropertyUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @package: mobvista.dmp.datasource.rtdmp
 * @author: wangjf
 * @date: 2020/7/20
 * @time: 4:44 下午
 * @email: jinfeng.wang@mobvista.com
 * @phone: 152-1062-7698
 */
public class RTDmpServer {

    public static final Logger logger = LoggerFactory.getLogger(RTDmpServer.class);

    private final static String BASE_URL = PropertyUtil.getProperty("config.properties", "rtdmp.url");
    //  private final static String BASE_URL = "http://ip-172-31-29-117:8688/";
    //  private final static String BASE_URL = "http://107.21.162.31:8688/";

    public static JSONObject query(String updateTimeStart, String updateTimeEnd, Integer minAudienceDataStatus,
                                   Integer maxAudienceDataStatus, Long audienceDataUtimeStart, Long audienceDataUtimeEnd, String audience_type) throws URISyntaxException {

        logger.info("rtdmp/query -->> update_time_start -->>" + updateTimeStart + ",update_time_end -->> " + updateTimeEnd +
                ",audience_date_utime_start -->> " + audienceDataUtimeStart + ",audience_date_utime_end -->> " + audienceDataUtimeEnd);

        JSONArray jsonArray = commonRequest(1, 10000, updateTimeStart, updateTimeEnd, audience_type);
        JSONObject result = new JSONObject();
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            if (jsonObject.getInteger("status") == 1
                    && jsonObject.getLong("audience_data_utime") >= audienceDataUtimeStart
                    && jsonObject.getLong("audience_data_utime") <= audienceDataUtimeEnd) {
                JSONObject audience = new JSONObject();
                int audienceId = jsonObject.getInteger("id");
                int data_update_method = jsonObject.getInteger("data_update_method");
                int audienceType = jsonObject.getInteger("audience_type");
                int isSyncDmpServer = jsonObject.getInteger("is_sync_dmpserver");
                JSONObject audienceRules = jsonObject.getJSONObject("audience_rules");
                String installedPackageName = jsonObject.getString("installed_package_name");
                JSONArray groupRules = jsonObject.getJSONArray("group_rules");
                if ((audienceRules.get("subtraction") != null && !audienceRules.getJSONArray("subtraction").isEmpty())
                        || (audienceRules.get("union") != null && !audienceRules.getJSONArray("union").isEmpty())
                        || (audienceRules.get("intersections") != null && !audienceRules.getJSONArray("intersections").isEmpty())
                        || (groupRules != null && !groupRules.isEmpty() && !groupRules.getJSONObject(0).isEmpty())
                        || StringUtils.isNotBlank(installedPackageName)) {
                    audience.put("data_update_method", data_update_method);
                    audience.put("audience_type", audienceType);
                    audience.put("is_sync_dmpserver", isSyncDmpServer);
                    audience.put("audience_rules", audienceRules);
                    audience.put("group_rules", groupRules);
                    audience.put("installed_package_name", installedPackageName);
                    result.put(String.valueOf(audienceId), audience);
                }
            }
        }
        return result;
    }

    public static JSONArray commonRequest(int page, int size, String updateTimeStart, String updateTimeEnd, String audience_type) throws URISyntaxException {

        CloseableHttpClient client = HttpClients.createDefault();
        List<BasicNameValuePair> formparams = new ArrayList<>();

        final String serverUrl = BASE_URL + "rtdmp/audience/query";
        URIBuilder uri = new URIBuilder();
        try {
            uri = new URIBuilder(serverUrl)
                    .addParameter("page", String.valueOf(page))
                    .addParameter("size", String.valueOf(size))
                    .addParameter("update_time_start", updateTimeStart)
                    .addParameter("update_time_end", updateTimeEnd)
                    .addParameter("audience_type", audience_type);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(1000).setConnectionRequestTimeout(1000)
                .setSocketTimeout(1000).build();

        final HttpGet httpGet = new HttpGet(uri.build());

        String key = UUID.randomUUID().toString();
        String token = MD5Util.getMD5Str(key.toString());

        httpGet.setHeader("Auth-System", "dmp");
        httpGet.setHeader("Content-Type", "text/plain");
        httpGet.setHeader("key", key);
        httpGet.setHeader("token", token);

        JSONArray jsonArray = new JSONArray();
        CloseableHttpResponse response;
        try {
            response = client.execute(httpGet);
            BufferedReader rd = new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent()));
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
            JSONObject jsonObject = Constants.String2JSONObject(result.toString());
            if (jsonObject.getInteger("code") == 200 && jsonObject.containsKey("data")) {
                jsonArray = jsonObject.getJSONArray("data");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            httpGet.abort();
        }
        return jsonArray;
    }

    public static void main(String[] args) {
        try {
            JSONObject json = query("2021-11-22 00:00:00", "2021-11-23 14:00:00",
                    0, 2, 1637510400L, 1637647200L, "6");
            System.out.println(json);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }


    }
}