package com.yanzuoguang.util.helper;

import com.yanzuoguang.util.YzgError;
import com.yanzuoguang.util.exception.CodeException;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 百度工具类
 *
 * @author 颜佐光
 */
public class BaiduHelper {
    public static final Pattern REGEX = Pattern.compile(".*\\((.*)\\).*");

    public static final class BaiduDate {

        public static final int version = 143;

        private String status;


        private List<BaiduData> data;

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public List<BaiduData> getData() {
            return data;
        }

        public void setData(List<BaiduData> data) {
            this.data = data;
        }
    }

    public static final class BaiduData {

        private int _version;

        private List<BaiduUlmanac> almanac;

        public int get_version() {
            return _version;
        }

        public void set_version(int _version) {
            this._version = _version;
        }

        public List<BaiduUlmanac> getAlmanac() {
            return almanac;
        }

        public void setAlmanac(List<BaiduUlmanac> almanac) {
            this.almanac = almanac;
        }
    }

    public static final class BaiduUlmanac {
        // 牛
        public String animal;
        //  装修.动土.安床.出行.安葬.上梁.旅游.破土.修造.求医.竖柱.词讼.出师.打官司
        public String avoid;
        // 二
        public String cnDay;
        // 14
        public String day;
        // 说明
        public String desc;
        // 乙丑
        public String gzDate;
        // 丁酉
        public String gzMonth;
        // 辛丑
        public String gzYear;
        // 1 or ""
        public String isBigMonth;
        // 初八
        public String lDate;
        // 八
        public String lMonth;
        // 8
        public String lunarDate;
        // 8
        public String lunarMonth;
        // 2021
        public String lunarYear;
        // 9
        public String month;
        // 2021
        public String oDate;
        // 搬家.开业.结婚.入宅.领证.开工.订婚.开张.作灶.入学.求嗣.赴任.祈福.祭祀.开市.纳财.纳畜.裁衣.嫁娶.纳采.移徙.盖屋.冠笄.栽种.斋醮.求财.招赘.纳婿
        public String suit;
        // 24节气
        public String term;
        // t,i,a
        public String type;
        // 世界节日
        public String value;
        // 2021
        public String year;
        // status: 1-工作日,2-上班,3-默认
        public String status;
    }

    /**
     * 获取百度万年历
     *
     * @param dt
     * @return
     */
    public static BaiduDate getBaiduData(Date dt) {
        String query = DateHelper.getDateTimeString("yyyy年M月", dt);

        long time = System.currentTimeMillis();
        Map<String, Object> map = new HashMap<>();
        // map.put("query", "2021年10月");
        map.put("query", query);
        map.put("co", "");
        map.put("resource_id", "39043");
        map.put("t", time);
        map.put("ie", "utf8");
        map.put("oe", "gbk");
        map.put("cb", "op_aladdin_callback");
        map.put("format", "json");
        map.put("tn", "wisetpl");
        map.put("cb", "jQuery1102007795278844876075_" + (time - 30));
        map.put("_", time - 50);

        String para = HttpHelper.getUrlParameter(map);

        String url = "https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?";
        String fullUrl = url + para;


        String post = HttpHelper.get(fullUrl, "gbk");
        if (StringHelper.isEmpty(post)) {
            throw YzgError.getRuntimeException("052");
        }
        Matcher matcher = REGEX.matcher(post);
        if (!matcher.find()) {
            throw YzgError.getRuntimeException("053");
        }
        String group = matcher.group(1);
        BaiduDate deserialize = JsonHelper.deserialize(group, BaiduDate.class);
        if (!StringHelper.compare(deserialize.status, "0")) {
            throw YzgError.getRuntimeException("054", deserialize.status, deserialize);
        }
        if (ArrayHelper.isEmpty(deserialize.getData())) {
            throw YzgError.getRuntimeException("055", deserialize);
        }
        if (ArrayHelper.isEmpty(deserialize.getData().get(0).almanac)) {
            throw YzgError.getRuntimeException("055", deserialize);
        }
        return deserialize;
    }


}