package cn.com.ctop.crawler.modules.core.util;

import java.net.URL;

/**
 * @author jeecg-boot
 * 2019年12月5日20:20:36
 */
public class FateadmUtil {
    protected String app_id;
    protected String app_key;
    protected String pd_id;
    protected String pd_key;
    protected String pred_url;

    public void init() {
        String app_id = "313821";
        String app_key = "EFlubJ1X+vFUpyNBTHAjoCHYLsrySdd4";
        String pd_id = "113821";
        String pd_key = "XAZWyy3WsCBzb66isPwa4qBNb/uMZXFN";
        init(app_id, app_key, pd_id, pd_key);
    }

    public void init(String app_id, String app_key, String pd_id, String pd_key) {
        this.app_id = app_id;
        this.app_key = app_key;
        this.pd_id = pd_id;
        this.pd_key = pd_key;
        this.pred_url = "http://pred.fateadm.com";
    }

    /**
     * 查询余额
     * 参数：无
     * 返回值：
     * resp.ret_code：正常返回0
     * resp.err_msg：异常时返回异常详情
     */
    public FateadmHttpUtil.HttpResp QueryBalc() throws Exception {
        //时间戳精确到秒。所以除以1000
        long cur_tm = System.currentTimeMillis() / 1000;
        String stm = String.valueOf(cur_tm);
        String sign = FateadmHttpUtil.CalcSign(pd_id, pd_key, stm);
        String url = this.pred_url + "/api/custval";
        String params = "user_id=" + this.pd_id + "&timestamp=" + stm + "&sign=" + sign;
        String pres = FateadmHttpUtil.httpPost(url, params);
        FateadmHttpUtil.HttpResp resp = FateadmHttpUtil.parseHttpResp(pres);
        return resp;
    }

    /***
     * 查询余额：直接返回余额结果
     * 参数：无
     * 返回值： 用户余额:double
     */
    public double QueryBalcExtend() throws Exception {
        FateadmHttpUtil.HttpResp resp = QueryBalc();
        return resp.custVal;
    }

    /**
     * 充值接口
     * 参数：cardid：充值卡号, cardkey：充值卡签名串
     * 返回值：
     * resp.ret_code：正常返回0
     * resp.err_msg：异常时返回异常详情
     */
    public FateadmHttpUtil.HttpResp Charge(String cardid, String cardkey) throws Exception {
        //时间戳精确到秒。所以除以1000
        long curTm = System.currentTimeMillis() / 1000;
        String stm = String.valueOf(curTm);
        String sign = FateadmHttpUtil.CalcSign(pd_id, pd_key, stm);
        String csign = FateadmHttpUtil.calcMd5(pd_key + stm + cardid + cardkey);
        String url = this.pred_url + "/api/charge";
        String params = "user_id=" + pd_id + "&timestamp=" + stm + "&sign=" + sign + "&cardid=" + cardid + "&csign=" + csign;
        String pres = FateadmHttpUtil.httpPost(url, params);
        FateadmHttpUtil.HttpResp resp = FateadmHttpUtil.parseHttpResp(pres);
        return resp;
    }

    /***
     * 充值接口：直接返回是否成功
     * 参数：cardid：充值卡号, cardkey：充值卡签名串
     * 返回值： 充值成功返回 0
     */
    private int ChargeExtend(String cardid, String cardkey) throws Exception {
        FateadmHttpUtil.HttpResp resp = Charge(cardid, cardkey);
        return resp.retCode;
    }


    /**
     * 文件形式进行验证码识别
     * 参数： pred_type：识别类型  file_name：文件名
     * 返回值：
     * resp.ret_code：正常返回0
     * resp.err_msg：异常时返回异常详情
     * resp.req_Id：唯一订单号
     * resp.pred_resl：识别的结果
     */
    public FateadmHttpUtil.HttpResp PredictFromFile(String predType, String fileName) throws Exception {
        byte[] fileData = FateadmHttpUtil.readBinaryFile(fileName);
        if (fileData == null) {
            FateadmHttpUtil.HttpResp resp = new FateadmHttpUtil.HttpResp();
            resp.retCode = -1;
            resp.errMsg = "ERROR: read file failed! file_name: " + fileName;
            return resp;
        }
        FateadmHttpUtil.HttpResp resp = Predict(predType, fileData);
        return resp;
    }

    /***
     * 文件形式进行验证码识别：直接返回识别结果
     * 参数： pred_type：识别类型  file_name：文件名
     * 返回值： 识别的结果:String
     */
    public String PredictFromFileExtend(String pred_type, String file_name) throws Exception {
        FateadmHttpUtil.HttpResp resp = PredictFromFile(pred_type, file_name);
        return resp.predResl;
    }

    /**
     * 验证码识别
     * 参数： pred_type：识别类型  img_data：图片数据
     * 返回值：
     * resp.ret_code：正常返回0
     * resp.err_msg：异常时返回异常详情
     * resp.req_Id：唯一订单号
     * resp.pred_resl：识别的结果
     */
    public FateadmHttpUtil.HttpResp Predict(String predType, byte[] imgData) throws Exception {
        //时间戳精确到秒。所以除以1000
        long curTm = System.currentTimeMillis() / 1000;
        String stm = String.valueOf(curTm);
        String sign = FateadmHttpUtil.CalcSign(pd_id, pd_key, stm);
        String asign = "";
        URL url = new URL(pred_url + "/api/capreg");
        if (!app_id.isEmpty()) {
            asign = FateadmHttpUtil.CalcSign(app_id, app_key, stm);
        }
        String pres = FateadmHttpUtil.mfPost(url, imgData, stm, pd_id, sign, app_id, asign, predType);
        FateadmHttpUtil.HttpResp resp = FateadmHttpUtil.parseHttpResp(pres);
        return resp;
    }

    /***
     * 验证码识别
     * 参数： pred_type：识别类型  img_data：图片数据
     * 返回值： 识别的结果:String
     */
    public String PredictExtend(String pred_type, byte[] img_data) throws Exception {
        FateadmHttpUtil.HttpResp resp = Predict(pred_type, img_data);
        return resp.predResl;
    }

    /**
     * 识别失败，进行退款请求
     * 参数： req_id：需要退款的订单号
     * 返回值：
     * resp.ret_code：正常返回0
     * resp.err_msg：异常时返回异常详情
     * <p>
     * 注意：
     * Predict识别接口，仅在RetCode == 0时才会进行扣款，才需要进行退款请求，否则无需进行退款操作
     * 注意2：
     * 退款仅在正常识别出结果后，无法通过网站验证的情况，请勿非法或者滥用，否则可能进行封号处理
     */
    public FateadmHttpUtil.HttpResp justice(String reqId) throws Exception {
        long curTm = System.currentTimeMillis() / 1000;
        String stm = String.valueOf(curTm);
        String sign = FateadmHttpUtil.CalcSign(pd_id, pd_key, stm);
        String url = pred_url + "/api/capjust";
        String params = "user_id=" + pd_id + "&timestamp=" + stm + "&sign=" + sign + "&request_id=" + reqId;
        String pres = FateadmHttpUtil.httpPost(url, params);
        FateadmHttpUtil.HttpResp resp = FateadmHttpUtil.parseHttpResp(pres);
        return resp;
    }

    /***
     * 退款请求： 直接返回是否成功
     * 参数： req_id：需要退款的订单号
     * 返回值： 返回 0 代表成功
     */
    public int JusticeExtend(String req_id) throws Exception {
        FateadmHttpUtil.HttpResp resp = justice(req_id);
        return resp.retCode;
    }

    public static void main(String[] args) {
        try {
            FateadmUtil api = new FateadmUtil();
            String app_id = "313821";
            String app_key = "EFlubJ1X+vFUpyNBTHAjoCHYLsrySdd4";
            String pd_id = "113821";
            String pd_key = "XAZWyy3WsCBzb66isPwa4qBNb/uMZXFN";
            // 对象生成之后，在任何操作之前，需要先调用初始化接口
            api.init(app_id, app_key, pd_id, pd_key);
            // 查询余额
            FateadmHttpUtil.HttpResp resp;
            // resp = api.QueryBalc();   // 查询余额返回详细信息
            // 直接返回余额结果
            double balance = api.QueryBalcExtend();

            // 具体类型可以查看官方网站的价格页选择具体的类型，不清楚类型的，可以咨询客服
//            String pred_type = "30400";
//            // 通过文件进行验证码识别,请使用自己的图片文件替换
//            String img_file = "./img.jpg";
//            // 多网站类型时，需要增加src_url参数，具体请参考api文档: http://docs.fateadm.com/web/#/1?page_id=6
//            resp    = api.PredictFromFile(pred_type, img_file);  // 返回识别结果的详细信息
            // String res1 = api.PredictFromFileExtend(pred_type, img_file); // 直接返回识别结果
/*
        // 如果是通过url或者截图得到二进制图片数据的，可以直接调用下面的接口
        resp    = api.PredictFromFile(pred_type, img_file);
        // String res2 = api.PredictExtend(pred_type, img_data); // 直接返回识别结果
*/
//            boolean jflag      = false;
//            if( jflag) {
//                // 识别的结果如果与预期不符，可以调用这个接口将预期不符的订单退款
//                // 退款仅在正常识别出结果后，无法通过网站验证的情况，请勿非法或者滥用，否则可能进行封号处理
//                int ret = api.JusticeExtend(resp.req_id); // 直接返回是否成功
//
//                resp = api.Justice(resp.req_id); // 返回完整信息
//            }

            // 开发者可以选择将充值接口集成到软件中，普通用户可以使用充值卡直接进行充值
            // 普通用户也可以选择到官方网站直接进行充值
            //String card_id = "36317545";
            //String card_key = "123456";
            //resp    = api.Charge(card_id, card_key);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
