package com.shanghaichengdi.ghjgitem.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Maps;
import com.shanghaichengdi.ghjgitem.exception.ExceptionEnum;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 常用工具类
 */

//@SuppressWarnings({"ALL", "AlibabaClassMustHaveAuthor"})
public class CommonTools {

  //算法
  private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";

  /**
   * @return java.lang.String
   * @Author zhanghaohao
   * @Description 通用返回数据格式
   * @Date 23:42 2020/3/24
   * @Param [msg 提示信息, code 错误代码, date 返回数据]
   **/
  public static String returnString(String enumName, JSONObject date) {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("code", ExceptionEnum.valueOf(enumName).getCode());
    jsonObject.put("msg", ExceptionEnum.valueOf(enumName).getMessage());
    if (date != null) {
      jsonObject.put("data", date.toString());
      jsonObject.put("count", date.size());
    } else {
      jsonObject.put("data", null);
    }
    return jsonObject.toString();
  }

  /**
   * @return java.lang.String
   * @Author sbj
   * @Description 通用返回数据格式，增加自定义错误码描述
   * @Date 2020/7/26
   * @Param [msg 提示信息, code 错误代码, date 返回数据]
   **/
  public static String returnString(String enumName, String enumMsg, JSONObject date) {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("code", ExceptionEnum.valueOf(enumName).getCode());
    if (enumMsg == null || enumMsg == "") {
      jsonObject.put("msg", ExceptionEnum.valueOf(enumName).getMessage());
    } else {
      jsonObject.put("msg", enumMsg);
    }

    if (date != null) {
      jsonObject.put("data", date.toString());
      jsonObject.put("count", date.size());
    } else {
      jsonObject.put("data", null);
    }
    return jsonObject.toString();
  }

  /**
   * 获得数据总条数
   *
   * @param list
   * @return
   */
  public static int getTotal(List list) {
    int tocal = (int) new PageInfo<>(list).getTotal();
    if (tocal == 0) {
      tocal = list.size();
    }
    return tocal;
  }

  public static String returnString(String enumName, JSONObject date, int totalRowCount) {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("code", ExceptionEnum.valueOf(enumName).getCode());
    jsonObject.put("msg", ExceptionEnum.valueOf(enumName).getMessage());
    if (date != null) {
      jsonObject.put("data", date.toString());
      jsonObject.put("count", totalRowCount);
    } else {
      jsonObject.put("data", null);
    }
    return jsonObject.toString();
  }

  /**
   * @return java.lang.String
   * @Author sbj
   * @Description 通用返回数据格式，增加自定义错误码描述和totalRowCount数据总数
   * @Date 2020/7/26
   * @Param [msg 提示信息, code 错误代码, date 返回数据]
   **/
  public static String returnString(String enumName, String enumMsg, JSONObject date,
      int totalRowCount) {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("code", ExceptionEnum.valueOf(enumName).getCode());
    if (enumMsg == null || enumMsg == "") {
      jsonObject.put("msg", ExceptionEnum.valueOf(enumName).getMessage());
    } else {
      jsonObject.put("msg", enumMsg);
    }

    if (date != null) {
      jsonObject.put("data", date.toString());
      jsonObject.put("count", totalRowCount);
    } else {
      jsonObject.put("data", null);
    }
    return jsonObject.toString();
  }

  /**
   * @param enumName      状态码
   * @param enumMsg       状态信息
   * @param list          对象结果列表
   * @param totalRowCount 总数据量，用于分页查询显示数据库中数据总数
   * @param pageSize      每页数据条数，用于分页查询，每页数据条数
   * @return java.lang.String
   * @Description 接口返回值封装函数returnString
   * @Author sbj
   * @Date 2020/8/1
   */
  public static String returnString(String enumName, String enumMsg, List<?> list,
      int totalRowCount, int pageSize) {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("code", ExceptionEnum.valueOf(enumName).getCode());
    if (enumMsg == null || enumMsg == "") {
      jsonObject.put("msg", ExceptionEnum.valueOf(enumName).getMessage());
    } else {
      jsonObject.put("msg", enumMsg);
    }
    JSONArray jsonArray = new JSONArray();
    JSONObject data = new JSONObject();
    if (list.size() != 0) {

      for (int i = 0; i < list.size(); i++) {
        jsonArray.add(object2UpperCase(list.get(i)));
      }
      //返回数据总页数
      int pageCount = 0;
      if (pageSize != 0) {
        pageCount =
            totalRowCount % pageSize == 0 ? totalRowCount / pageSize : totalRowCount / pageSize + 1;
      }
      data.put("TotalRowCount", totalRowCount);
      data.put("PageCount", pageCount);
      data.put("Rows", jsonArray);
    } else {
      data.put("TotalRowCount", totalRowCount);
      data.put("PageCount", 0);
      data.put("Rows", jsonArray);
    }
    jsonObject.put("data", data);
    jsonObject.put("count", totalRowCount);
    return jsonObject.toString();
  }

  public static Map objectToMap(Object obj) {
    if (obj == null) {
      return null;
    }
    Map map = new HashMap();
    try {
      Field[] declaredFields = obj.getClass().getDeclaredFields();
      for (Field field : declaredFields) {
        field.setAccessible(true);
        map.put(field.getName(), field.get(obj));
      }
    } catch (Exception e) {
      map.put("code", "500");
      map.put("result", "false");
      map.put("msg", "程序内部错误");
      map.put("data", null);
      map.put("count", "1");
    }
    return map;
  }

  public static Map<String, Object> object2UpperCase(Object entity) {
    Map<String, Object> res = Maps.newHashMap();
    if (null == entity) {
      return res;
    }
    //将对象的属性转化为大写
    Map<String, Object> map = (Map) JSONObject.toJSON(entity);
    if (null != map && !map.isEmpty()) {
      for (Map.Entry<String, Object> entry : map.entrySet()) {
        /**
         * TODO-关键在这里根据业务需要转大小写
         */
        res.put(entry.getKey().toUpperCase(),
            entry.getValue() == "" || entry.getValue() == null ? "" : entry.getValue());
      }
    }
    return res;
  }
}
