package cn.com.ctop.toutiao.test;

import cn.com.ctop.common.module.utils.HttpUtils;
import cn.com.ctop.crawler.modules.core.util.FateadmHttpUtil;
import cn.com.ctop.crawler.modules.core.util.FateadmUtil;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.beans.factory.annotation.Value;

import java.text.SimpleDateFormat;
import java.util.*;

public class Test {

    @Value("${jeecg.path.chrome-driver}")
    private String chromeDriver;

    public void test(String url) {
        System.getProperties().setProperty("webdriver.chrome.driver", chromeDriver);
        try {
            ChromeOptions chromeOptions = new ChromeOptions();
            WebDriver webDriver = new ChromeDriver(chromeOptions);
            chromeOptions.addArguments("--headless");
            chromeOptions.addArguments("--incognito");
            chromeOptions.addArguments("--no-sandbox");
            chromeOptions.addArguments("--disable-gpu");
            chromeOptions.addArguments("--window-size=1290,1080");
            chromeOptions.addArguments("--user-agent=" + HttpUtils.USER_AGENT);
            chromeOptions.setAcceptInsecureCerts(true);
            //获取登录页面
            webDriver.get(url);

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (Cookie cookie : webDriver.manage().getCookies()) {
                BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
                ck.setDomain("ad.oceanengine.com");
                ck.setExpiryDate(cookie.getExpiry());
                ck.setPath(cookie.getPath());
                HttpUtils.COOKIESTORE.addCookie(ck);
            }

            String html = webDriver.getPageSource();
            Map<String, String> header = new HashMap<>();
            header.put("Accept", "*/*");
            header.put("Connection", "keep-alive");
            header.put("Host", "sso.toutiao.com");
            header.put("Content-Type", "application/x-www-form-urlencoded");
            header.put("Origin", "https://ad.oceanengine.com");
            header.put("Referer", "https://ad.oceanengine.com/pages/login/index.html");
            Map<String, Object> param = new HashMap<String, Object>();
            param.put("mobile", "");
            param.put("code", "");
            param.put("account", "dcd_ad@bytedance.com");
            param.put("password", "typdDCD@2018");
            param.put("captcha", "hqde");
            param.put("is_30_days_no_login", "true");
            param.put("service", "https://ad.oceanengine.com");
            String res = HttpUtils.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            JsonNode jsonNode = mapper.readTree(res);
            Integer errorCode = jsonNode.get("error_code").asInt();
            String orderId = null;
            while (errorCode != 0) {
                FateadmUtil fateadmUtil = new FateadmUtil();
                fateadmUtil.init();
                if (orderId != null) {
                    fateadmUtil.Justice(orderId);
                }
                String captcha = jsonNode.get("captcha").asText();
                Base64.Decoder decoder = Base64.getDecoder();
                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decode(captcha));
                param.put("captcha", resp.pred_resl);
                orderId = resp.req_id;
                res = HttpUtils.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
                jsonNode = mapper.readTree(res);
                errorCode = jsonNode.get("error_code").asInt();
            }
            if (errorCode == 0) {
                String csrftoken = "";
                List<org.apache.http.cookie.Cookie> cookies = HttpUtils.COOKIESTORE.getCookies();
                for (org.apache.http.cookie.Cookie ck : cookies) {
                    Cookie cookie = new Cookie(ck.getName(), ck.getValue(), "." + ck.getDomain(), ck.getPath(), ck.getExpiryDate());
                    webDriver.manage().addCookie(cookie);
                }
                //登录成功 进入推广页面
                webDriver.get("https://ad.oceanengine.com/pages/promotion.html#/ad");
                //创建广告组页面
                webDriver.get("https://ad.oceanengine.com/pages/campaign/create.html");

                Map<String, Object> param2 = new HashMap<>();
                Map<String, Object> param3 = new HashMap<>();
                param3.put("budget", 0);
                param3.put("budget_mode", -1);
                param2.put("campaign_id", "");
                param2.put("campaign_name", "自动创建测试444444");
                param2.put("landing_type", 3);
                param2.put("campaign_type", 1);
                param2.put("budget", param3);

                for (Cookie cookie : webDriver.manage().getCookies()) {
                    if ("csrftoken".equals(cookie.getName())) {
                        csrftoken = cookie.getValue();
                    }
                    BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
                    ck.setDomain("ad.oceanengine.com");
                    ck.setExpiryDate(cookie.getExpiry());
                    ck.setPath(cookie.getPath());
                    HttpUtils.COOKIESTORE.addCookie(ck);
                }
                header.put("Accept", "application/json, text/javascript, */*; q=0.01");
                header.put("Connection", "keep-alive");
                header.put("Host", "ad.oceanengine.com");
                header.put("Content-Type", "application/json");
                header.put("Origin", "https://ad.oceanengine.com");
                header.put("X-CSRFToken", csrftoken);
                header.put("X-Requested-With", "XMLHttpRequest");
                header.put("Referer", "https://ad.oceanengine.com/pages/campaign/create.html");
                // 创建广告组返回信息
                res = HttpUtils.httpPostRequest("https://ad.oceanengine.com/overture/campaign/create/", param2, header);
                JsonNode node = mapper.readTree(res);
                //广告组id
                String campaignId = node.get("data").get("campaign_id").asText();
                String url2 = "https://ad.oceanengine.com/pages/ad/create.html?campaign_id=" + campaignId + "&landing_type=3&temp_id=ADvQb";
                webDriver.get(url2);
                header.put("Referer", url2);
                for (Cookie cookie : webDriver.manage().getCookies()) {
                    BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
                    ck.setDomain("ad.oceanengine.com");
                    ck.setExpiryDate(cookie.getExpiry());
                    ck.setPath(cookie.getPath());
                    HttpUtils.COOKIESTORE.addCookie(ck);
                }
                String siteStr = HttpUtils.httpGetRequest("https://ad.oceanengine.com/overture/api/adv_site/get_site_list/?_=" + String.valueOf(System.currentTimeMillis()));
                String convStr = HttpUtils.httpGetRequest("https://ad.oceanengine.com/overture/api/get_tetris_action/?external_url=&type=external&pricing=9&landing_type=3&_=" + String.valueOf(System.currentTimeMillis()));
                JsonNode siteNode = mapper.readTree(siteStr);
                JsonNode convNode = mapper.readTree(convStr);

                Map<String, Object> param4 = new HashMap<String, Object>();
                param4.put("location_type", 4);
                param4.put("aweme_account_fans", 0);
                String tokenStr = HttpUtils.httpPostRequest("https://ad.oceanengine.com/api/v1/hl/ad/audience/estimate/", param4, header);
                JsonNode tokenNode = mapper.readTree(tokenStr);
                Map<String, Object> param5 = new HashMap<String, Object>();
                // 投放范围
                param5.put("delivery_range", 1);
                //广告类别  5 内广
                param5.put("classify", 5);
                param5.put("projectid", "");
                //下载方式    1下载链接 2包含下载链接的落地页
                param5.put("download_type", 2);
                param5.put("localGeolocation", new ArrayList<String>());
                // 落地页链接
                param5.put("external_url", "https://ad.oceanengine.com/tetris/page/" + siteNode.get("data").get(0).get("siteId").asText());
                // 转换id
                param5.put("convert_id", convNode.get("action_data").get(0).get("id").asLong());
                //  应用直达链接
                param5.put("open_url", "");
                param5.put("style_type", 0);
                //受众位置类型
                param5.put("location_type", 4);
                // 过滤已安装，当推广目标为安卓应用下载时可填，0表示不过滤，1表示过滤，默认为不过滤
                param5.put("hide_if_exists", 0);
                //兴趣分类
                param5.put("interest_tag_mode", 0);
                param5.put("token", tokenNode.get("data").get("token").asText());
                //头条预估数据
                param5.put("toutiao", 100000005);
                //抖音预估数据
                param5.put("aweme", 150000005);
                //西瓜预估数据
                param5.put("video_app", 40000005);
                //火山预估数据
                param5.put("hotsoon", 40000005);
                //账号粉丝相似人群
                param5.put("aweme_account_fans", 0);
                // 智能放量？？？？
                param5.put("auto_extend_enabled", 0);
                // 广告预算类型  0 日预算  1 总预算
                param5.put("budget_mode", 0);
                //广告预算
                param5.put("budget", 300);
                //广告投放时间类型   默认1 1：不限  2：按时间？？？
                param5.put("schedule_type", 1);
                //广告投放起始时间
                param5.put("start_time", "2019-07-02 00:00");
                //广告投放结束时间
                param5.put("end_time", "2019-07-03 23:59");
                //投放时段
                param5.put("week_schedule", new ArrayList<String>());
                //投放时段
                param5.put("week_time", new ArrayList<ArrayList<Integer>>());
                //计划出价类型  9 按展示付费  7 按点击付费 8 按转化付费
                param5.put("pricing", 9);
                //出价为OCPC时，计划处于哪个阶段??
                param5.put("cpa_phrase", 2);
                param5.put("is_union_slot", "");
                //过滤已转化用户类型字段，只有转化为目标时可填 优化目标为转化才展示
                param5.put("hide_if_converted", 1);
                //投放速度/投放方式使用字段
                param5.put("flow_control_mode", 0);
                param5.put("cpa_bid", 1);
                //自动出价类型，OCPM支持
                param5.put("smart_bid_type", 0);
                //是否调整自动出价   允许值: "0", "1"  默认值: 0
                param5.put("adjust_cpa", 0);
                param5.put("app_bid_ratio", new Object());
                //广计划名称
                param5.put("name", "自动创建测试4");
                param5.put("campaign_id", campaignId);
                String createResult = HttpUtils.httpPostRequest("https://ad.oceanengine.com/overture/ad/create/", param5, header);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
