package com.boco.nbd.wios.flow.util;

import cn.hutool.core.date.DatePattern;
import com.aliyun.oss.ServiceException;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.boco.nbd.wios.flow.entity.SecretBindDTO;
import com.boco.nbd.wios.manage.contants.WiosConstant;
import com.ihidea.core.util.JSONUtilsEx;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;

/**
 * 号码隐私保护工具类
 *
 * @author xgl
 * @version [版本号, 2020年12月21日]
 */
public class PhoneNumProtectionUtil {

    private static Logger logger = LoggerFactory.getLogger(PhoneNumProtectionUtil.class);

    private static final String ALI_APPKEY = "LTAI5tFo5PHXPUEGP7zrbSGe";

    private static final String ALI_APPSECRET = "jU3mM34HWPdPKLnao9aF1ZFURt5sj3";

    public static final String ALI_POOLKEY = "FC100000118866049";

    public static void buySecretNo() throws Exception {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ALI_APPKEY, ALI_APPSECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dyplsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        // 调用BuySecretNo接口购买号码。
        request.setSysAction("BuySecretNo");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PoolKey", ALI_POOLKEY);
        // 号码类型。其中:1表示虚商号码,即170或171。2表示运营商号码。3表示95号码。
        request.putQueryParameter("SpecId", "1");
        // 城市
        request.putQueryParameter("City", "全国");

        CommonResponse response = client.getCommonResponse(request);
        String responseData = response.getData();
        logger.info("[buySecretNo]responseData:{}", responseData);
        Map map = JSONUtilsEx.deserialize(responseData, Map.class);
        Object code = map.get("Code");
        if (code != null && WiosConstant.OK.equals(code.toString())) {
            return;
        }
        throw new ServiceException("购买失败,错误码:" + code);
    }

    public static SecretBindDTO bindAxn(String phone) throws Exception {
        SecretBindDTO returnValue = new SecretBindDTO();
        SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 2);
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ALI_APPKEY, ALI_APPSECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dyplsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        // 调用接口BindAxn添加AXN号码的绑定关系。
        request.setSysAction("BindAxn");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNoA", phone);
        request.putQueryParameter("Expiration", sdf.format(cal.getTime()));
        request.putQueryParameter("PoolKey", ALI_POOLKEY);
        request.putQueryParameter("CallDisplayType", "2");

        CommonResponse response = client.getCommonResponse(request);
        String responseData = response.getData();
        logger.info("[bindAxn]phone={},responseData:{}", phone, responseData);
        Map map = JSONUtilsEx.deserialize(responseData, Map.class);
        returnValue.setCode(map.get("Code") == null ? null : map.get("Code").toString());
        Object obj = map.get("SecretBindDTO");
        if (obj != null) {
            Map<String, Object> objectMap = (Map<String, Object>)obj;
            returnValue.setSecretNo(objectMap.get("SecretNo") == null ? null : objectMap.get("SecretNo").toString());
            returnValue.setSubsId(objectMap.get("SubsId") == null ? null : objectMap.get("SubsId").toString());
        }
        returnValue.setExpiredDate(cal.getTime());
        return returnValue;
    }

    public static void unbindSubscription(String subsId, String secretNo) throws Exception {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ALI_APPKEY, ALI_APPSECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dyplsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        // 调用接口UnbindSubscription解除号码的绑定关系。
        request.setSysAction("UnbindSubscription");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("SubsId", subsId);
        request.putQueryParameter("SecretNo", secretNo);
        request.putQueryParameter("PoolKey", ALI_POOLKEY);

        CommonResponse response = client.getCommonResponse(request);
        String responseData = response.getData();
        logger.info("[unbindSubscription]subsId={},secretNo={},responseData:{}", subsId, secretNo, responseData);
        Map map = JSONUtilsEx.deserialize(responseData, Map.class);
        Object code = map.get("Code");
        if (code != null && WiosConstant.OK.equals(code.toString())) {
            return;
        }
        throw new ServiceException("解绑失败,错误码:" + code);
    }

    public static void releaseSecretNo(String secretNo) throws Exception {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ALI_APPKEY, ALI_APPSECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dyplsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        // 调用接口ReleaseSecretNo释放号码。
        request.setSysAction("ReleaseSecretNo");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PoolKey", ALI_POOLKEY);
        // 需要释放的隐私号码,需要填写完整的手机号码
        request.putQueryParameter("SecretNo", secretNo);

        CommonResponse response = client.getCommonResponse(request);
        String responseData = response.getData();
        logger.info("[releaseSecretNo]secretNo={},responseData:{}", secretNo, responseData);
        Map map = JSONUtilsEx.deserialize(responseData, Map.class);
        Object code = map.get("Code");
        if (code != null && WiosConstant.OK.equals(code.toString())) {
            return;
        }
        throw new ServiceException("释放失败,错误码:" + code);
    }

    public static void querySecretNoRemain() throws Exception {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ALI_APPKEY, ALI_APPSECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dyplsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        // 调用接口QuerySecretNoRemain查询线上可购号码余量。
        request.setSysAction("QuerySecretNoRemain");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        // 号码类型。其中:1表示虚商号码,即170或171。2表示运营商号码。3表示95号码。
        request.putQueryParameter("SpecId", "1");
        // 号码的归属地。
        request.putQueryParameter("City", "杭州");
        // 号码前缀,最长18位
        request.putQueryParameter("SecretNo", "180");

        CommonResponse response = client.getCommonResponse(request);
        System.out.println(response.getData());
        System.out.println(response.getHttpStatus());
    }
}