package com.reyun.saas.mob.util;

import cn.hutool.json.JSONUtil;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.reyun.saas.common.framework.component.AwsDynamoDBComponent;
import com.reyun.saas.mob.user.domain.App;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author: hanzepeng
 * @Date: 2021/10/11/16:29
 * @Description: ddb工具类
 */
@Slf4j
@Component
public class DDBUtils {

    @Resource
    private AwsDynamoDBComponent awsDynamoDBComponent;

    //ios设备状态表
    public static final String YY_TCTINFO_IOS =  "yy_rctinfo_ios";

    //安卓设备状态表
    public static final String YY_TCTINFO_ANDROID =  "yy_rctinfo_android";

    //ddb的rta白名单表
    public static final String RTA_TABLE_NAME = "yy_rta_whitelist";

    //app-设备表
    public static final  String YY_APP_DEVICEINFO = "yy_app_deviceinfo";

    //安卓sdk版本与策略关系表
    public static final  String SDK_POLICY_ANDROID = "yy_strategy_config_android";

    //IOS sdk版本与策略关系表
    public static final  String SDK_POLICY_IOS = "yy_strategy_config_ios";

    //标签映射表
    public static final String  LABEL_MAPPING = "yy_label_mapping";

    //appkey——oid.bid.os关联表
    public static final  String  YY_APP_INFO = "yy_app_info";


    /**
     * 获取ddb项目
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键值
     * @return item
     */
    public  Item getItem(String tableName,String primaryKeyName,String prmaryKeyValue){
        //校验参数
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }

        Table table = awsDynamoDBComponent.getTable(tableName);

        return table.getItem(primaryKeyName, prmaryKeyValue);
    }


    /**
     * 获取ddb项目并转换成json
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键值
     * @return json
     */
    public  String getItemJSON(String tableName,String primaryKeyName,String prmaryKeyValue){
        //校验参数
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }
        Table table = awsDynamoDBComponent.getTable(tableName);
        Item item = table.getItem(primaryKeyName, prmaryKeyValue);
        return item.toJSON();
    }

    /**
     * 获取ddb项目并且转换成MAP
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键值
     * @return map
     */
    public  Map getItem2Map(String tableName, String primaryKeyName, String prmaryKeyValue){
        //校验参数
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }
        Table table = awsDynamoDBComponent.getTable(tableName);
        Item item = table.getItem(primaryKeyName, prmaryKeyValue);

        LinkedHashMap linkedHashMap = null;
        if(item != null){
            linkedHashMap = JSONUtil.toBean(item.toJSON(), LinkedHashMap.class);
        }
        return linkedHashMap;
    }


    /**
     * item添加String
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键值
     * @param fieldName  String的字段名
     * @param str  要添加的String
     * @return
     */
    public void putString (String tableName, String primaryKeyName, String prmaryKeyValue,String fieldName,String str){
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }

        //如果item为空 创建一个item
        Table table = awsDynamoDBComponent.getTable(tableName);
        Item item = table.getItem(primaryKeyName, prmaryKeyValue);
        if (item == null) {
            item = new Item();
            item.withPrimaryKey(primaryKeyName,prmaryKeyValue);
        }

        if (StringUtils.isEmpty(str)) {
            item.removeAttribute(fieldName);
        } else {
            item.withString(fieldName,str);
        }
        awsDynamoDBComponent.writeItem(tableName, item);

    }

    /**
     * item添加List
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键值
     * @param fieldName  List集合
     * @param list  要添加的List
     * @return
     */
    public void putList (String tableName, String primaryKeyName, String prmaryKeyValue, String fieldName, List list){
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }

        //如果item为空 创建一个item
        Table table = awsDynamoDBComponent.getTable(tableName);
        Item item = table.getItem(primaryKeyName, prmaryKeyValue);
        if (item == null) {
            item = new Item();
            item.withPrimaryKey(primaryKeyName,prmaryKeyValue);
        }

        if (CollectionUtils.isEmpty(list)) {
            item.removeAttribute(fieldName);
        } else {
            item.withList(fieldName,list);
        }
        awsDynamoDBComponent.writeItem(tableName, item);

    }


    /**
     * item添加map 如果map中没有元素 则删除该item的map
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键值
     * @param fieldName  set的字段名
     * @param map  要添加的map集合
     * @return
     */
    public void putMap (String tableName, String primaryKeyName, String prmaryKeyValue,String fieldName,Map map){
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }

        //如果item为空 创建一个item
        Table table = awsDynamoDBComponent.getTable(tableName);
        Item item = table.getItem(primaryKeyName, prmaryKeyValue);
        if (item == null) {
            item = new Item();
            item.withPrimaryKey(primaryKeyName,prmaryKeyValue);
        }

        //校验map的size  如果为0 则删除item的该字段
        if (CollectionUtils.isEmpty(map)) {
            item.removeAttribute(fieldName);
        } else {
            item.withMap(fieldName,map);
        }
        awsDynamoDBComponent.writeItem(tableName, item);

    }

    /**
     * item添加set
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键值
     * @param fieldName set的字段名
     * @Param set 要添加的set集合
     * @return
     */
    public void putSet(String tableName, String primaryKeyName, String prmaryKeyValue,String fieldName, Set set){
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }


        Table table = awsDynamoDBComponent.getTable(tableName);
        Item item = table.getItem(primaryKeyName, prmaryKeyValue);

        if (item == null) {
            item = new Item();
            item.withPrimaryKey(primaryKeyName,prmaryKeyValue);
        }
        if (CollectionUtils.isEmpty(set)) {
            item.removeAttribute(fieldName);
        } else {
            item.withStringSet(fieldName,set);
        }

        awsDynamoDBComponent.writeItem(tableName, item);
    }


    /**
     * 查询项目是否存在
     * @param tableName ddb表名
     * @param primaryKeyName 主键字段名称
     * @param prmaryKeyValue 主键value
     * @return 是否存在  true为存在  false为不存在
     */
    public boolean itemExists(String tableName, String primaryKeyName, String prmaryKeyValue){

        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }

        Table table = awsDynamoDBComponent.getTable(tableName);

        Item item = table.getItem(primaryKeyName, prmaryKeyValue);
        if(item == null){
            return false;
        }
        return true;
    }

    /**
     * 删除ddb表中的item
     * @param tableName 表名
     * @param primaryKeyName 主键字段
     * @param prmaryKeyValue 主键value
     */
    public void deleteIetm(String tableName, String primaryKeyName, String prmaryKeyValue){
        if (StringUtils.isEmpty(tableName)
                ||StringUtils.isEmpty(primaryKeyName)
                ||StringUtils.isEmpty(prmaryKeyValue)) {
            throw new RuntimeException("参数错误");
        }
        Table table = awsDynamoDBComponent.getTable(tableName);
        table.deleteItem(primaryKeyName, prmaryKeyValue);
    }

    /**
     * put appkey——oid,type.bundleid对应关系
     * @param app 目标app
     * @param oid //用户oid
     */
    public void putAppInfo(App app,String oid) {
        if(app == null || StringUtils.isEmpty(app.getAppkey())
            || StringUtils.isEmpty(oid)){
            throw new RuntimeException("参数错误");
        }

        String  type = "iOS".equals(app.getOs())?"1":"2";
        String bid = StringUtils.isEmpty(app.getBid())?"default":app.getBid();

        Item item = new Item();
        item.withPrimaryKey("appkey",app.getAppkey());//appkey
        item.withString("type",type);//系统
        item.withString("oid",oid);//oid
        item.withString("bundleid",bid);//bid
        awsDynamoDBComponent.writeItem(YY_APP_INFO,item);
    }
}
