const system = require("../../system");
const ServiceBase = require("../sve.base");
class CalcnameService {
  constructor() {
    this.basedao = system.getObject("db.orderDao");

  }
  getApp(appkey) {
    return this.cacheManager["AppCache"].cacheApp(appkey);
  }
  async ncloneadrivename(obj) {
    var nclList = obj.ncl_list;
    var limitCount = obj.limit_count || 24;
    var vector = obj.vector || 3;

    var sql = "SELECT DISTINCT(`name`) FROM tm_word_frequency AS sh1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(times) FROM tm_word_frequency)-(SELECT MIN(times) FROM tm_word_frequency))+ (SELECT MIN(times) FROM tm_word_frequency)) AS times) AS sh2 ";
    if (nclList && nclList != "undefined") {
      vector = 50;
      sql = sql + " WHERE sh1.times>=sh2.times/" + vector + " AND sh1.`ncl_one` in(" + nclList + ") LIMIT " + limitCount;
    } else {
      sql = sql + " WHERE sh1.times>=sh2.times/" + vector + " LIMIT " + limitCount;
    }
    try {
      var result = await this.basedao.customQuery(sql);
      if (!result || result.length == 0) {
        return null;
      }
      var tmpList = [];
      for (let index = 0; index < result.length; index++) {
        const element = result[index];
        if (element) {
          tmpList.push(element.name);
        }
      }
      if (!tmpList || tmpList.length == 0) {
        return null;
      }
      return tmpList;
    } catch (error) {
      return null;
    }
  }

  async calcname(obj) {
    var nclone = obj.ncl_list == null ? null : obj.ncl_list;//大类
    var names = obj.names || "";//输入的关键字
    var namenum = obj.namenum == null ? 4 : obj.namenum;//目标名字长度
    var namelist = obj.namelist == null ? null : obj.namelist;//高频字库
    var calnames = obj.calnames == null ? 1000 : obj.calnames;//目标名字个数
    if (names) {
      names = names.split('');
    }
    // var names = ["威", "匠", "美"];
    // var namelist = ["金", "美", "丰", "宝", "农", "力", "天", "大", "特", "乐", "德", "科", "达", "中", "绿", "源", "华", "海", "康", "利", "生", "龙", "尔", "多", "家", "福", "斯", "新", "地", "鑫", "田", "瑞", "安", "化", "富", "佳", "一", "沃", "优", "果", "泰", "之", "三", "施", "润", "克", "山", "博", "盛", "星", "能", "嘉", "花", "威", "高", "邦", "红", "士", "百", "益", "禾", "蓝", "得", "普", "王", "万", "东", "根", "诺", "吉", "爱", "好", "肥", "保", "工", "水", "素", "兴", "土", "业", "旺", "元", "立", "森", "云", "国", "神", "光", "小", "奥", "园", "林", "世", "合", "喜", "凯", "丽", "固", "和", "恒", "物", "品", "叶", "可", "通", "易", "车", "欧", "贝", "维", "马", "卡", "格", "方", "联", "正", "石", "菌", "技", "双", "亿", "迪", "谷", "奇", "聚", "子", "艾", "信", "人", "西", "道", "兰", "牛", "隆", "莱", "阳", "灵", "加", "圣", "江", "米", "亚", "长", "彩", "牌", "来", "汇", "创", "发", "净", "明", "宏", "思", "健", "冠", "成", "赛", "满", "南", "春", "环", "雅", "玉", "洁", "顺", "宇", "友", "黑", "惠", "微", "清", "速", "青", "壮", "飞", "纳", "丹", "永", "阿", "城", "全", "峰", "收", "晶", "祥", "鲁", "白", "九", "众", "强", "有", "智", "欣", "北", "鼎", "拉", "动", "心", "植", "路", "太", "稻", "倍", "老", "鸿", "夫", "色", "泽", "日", "精", "超", "尚", "号", "胶", "洋", "巴", "上", "霸", "雪", "银", "麦", "胜", "树", "匠", "五", "河", "木", "广", "罗", "稼", "氏", "久", "杰", "千", "建", "帝", "恩", "黄", "风", "香", "仕", "活", "汉", "集", "川", "诚", "苗", "泉", "控", "护", "快", "驰", "京", "时", "基", "尼", "荣", "锦", "粒", "耐", "四", "行", "民", "腾", "碧", "松", "年", "原", "雨", "劲", "湖", "昌", "碳", "必", "无", "玛", "辉", "皇", "公", "英", "居", "师", "里", "下", "实", "团", "菲", "卫", "豪", "迈", "都", "捷", "材", "苏", "油", "航", "枫", "粮", "宁", "姆", "巨", "先", "朗", "硅", "远", "真", "盾", "甲", "宜", "靓", "翔", "悦", "堂", "瓷", "裕", "本", "洲", "澳", "同", "养", "盈", "升", "茂", "佰", "然", "派", "开", "司", "卓", "极", "古", "缘", "学", "露", "雷", "虎", "曼", "亮", "意", "锐", "良", "鱼", "艺", "比", "名", "硕", "草", "二", "晟", "客", "代", "顿", "象", "藻", "塔", "竹", "鹏", "港", "帮", "梦", "哈", "月", "点", "商", "秀", "伟", "态", "塑", "希", "法", "伊", "运", "庄", "蒙", "秋", "景", "线", "珠", "仙", "洛", "炭", "料", "齐", "火", "头", "浩", "量", "平", "哥", "慧", "六", "翠", "耕", "州", "壹", "孚", "狮", "昊", "拓", "村", "君", "魔", "际", "岛", "七", "旭", "越", "铁", "鲜", "豆", "鹰", "文", "途", "八", "冰", "磷", "野", "虹", "医", "典", "领", "顶", "晨", "盖", "坤", "津", "十", "乡", "豫", "波", "电", "庆", "涂", "纪", "豹", "的", "肽", "桥", "管", "门", "增", "尊", "军", "弘", "柏", "索", "网", "湘", "手", "不", "舒", "机", "撒", "夏", "滴", "自", "贵", "钾", "球", "妙", "添", "季", "补", "药", "铭", "味", "昆", "牧", "睿", "启", "穗", "标", "歌", "善", "仁", "伴", "辰", "凤", "会", "丝", "锋", "布", "界", "扬", "程", "甜", "纯", "御", "志", "柯", "展", "事", "空", "复", "雄", "者", "限", "连", "怡", "猫", "台", "气", "享", "仓", "密", "盟", "伯", "紫", "摩", "欢", "珍", "伦", "依", "滋", "粤", "粘", "唐", "度", "资", "燕", "沙", "防", "鹿", "效", "誉", "缝", "为", "酸", "轩", "畅", "赢", "登", "桂", "酷", "盐", "冲", "融", "巧", "脂", "知", "鸟", "如", "深", "至", "耀", "重", "菜", "芬", "申", "羊", "传", "财", "专", "骏", "钙", "研", "剂", "陶", "芳", "晋", "熊", "用", "朋", "武", "秦", "将", "勒", "馨", "凡", "弗", "唯", "酶", "臻", "印", "禹", "封", "助", "儿", "拜", "常", "产", "统", "帅", "液", "茶", "陆", "莲", "萃", "望", "种", "芸", "场", "钻", "致", "仑", "食", "亨", "墙", "凌", "渔", "体", "核", "蒂", "圆", "芭", "蔬", "营", "旗", "爽", "傅", "冷", "辛", "玖", "我", "韵", "埃", "赫", "诗", "郎", "功", "乾", "饰", "情", "分", "钢", "锌", "修", "芯", "浪", "霖", "坊", "钛", "瀚", "蜜", "义", "镁", "壳", "岭"];//
    var namelistParam = { ncl_list: nclone, limit_count: 100, vector: 50 };
    namelist = await this.ncloneadrivename(namelistParam);
    var cnames = [];//生成名字数组
    console.log(names);
    var self = this;
    if (namelist) {
      var result = null;
      var info = {};
      // if (names.length > 0) {
      //遍历输入的字组
      for (var i = 0; i < 1000; i++) {
        console.log(names);
        var cname = [];// [names[i % names.length]];　//第一个字
        var newd = [];// names.filter(el => !~cname.indexOf(el))  //删除用过的汉字
        var strname = "";// cname.join("");//

        if (names && names.length > 0) {
          cname = [names[i % names.length]];　//第一个字
          newd = names.filter(el => !~cname.indexOf(el))  //删除用过的汉字
          strname = cname.join("");//
        }
        info = {
          nclone: nclone,
          newd: newd,
          strname: strname,
          cnames: cnames,
          calnames: calnames,
          namenum: namenum,
          cname: cname,
          namelist: namelist,
          names: names
        }
        result = await self.calnamefors(info);
        if (info.cnames.length >= info.calnames) {
          console.log(info.cnames);
          return info.cnames;
        }
      }
      // }
      cnames = info.cnames;
    }
    return cnames
  }

  async calnamefors(obj) {
    var self = this;
    if (obj.strname.length < obj.namenum) {//取输入字词
      if (obj.newd.length > 0) {
        for (var i = 0; i < obj.newd.length; i++) {
          if (obj.strname.length + obj.newd[i].length >= obj.namenum) {
            obj.newd = obj.newd.filter(el => !~obj.newd.indexOf(el));
            await self.calnamefors(obj);
          } else {
            obj.cname.push(obj.newd[i]);
            obj.newd = obj.newd.filter(el => !~obj.cname.indexOf(el));
            obj.strname = obj.cname.join("");
            await self.calnamefors(obj);
          }
        }
      } else {//取高频字
        obj.cname.push(obj.namelist[Math.floor(Math.random() * 10)]);
        obj.strname = obj.cname.join("");
        if (obj.strname.length == obj.namenum) {
          if (!Array.prototype.derangedArray) {//随机字符串顺序
            Array.prototype.derangedArray = function () {
              for (var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x);
              return this;
            };
          }
          obj.cname = obj.cname.derangedArray();
          obj.strname = obj.cname.join("");
        }
        await self.calnamefors(obj);
      }
    } else if (obj.strname.length == obj.namenum && obj.cnames.indexOf(obj.strname) < 0) {
      if (obj.cnames.length >= obj.calnames) {
        return obj;
      } else {
        var a = await self.fangft(obj.strname);
        if (a) {
          obj.cnames.push(obj.strname);
          console.log(obj.cnames.length)
        }
        console.log(obj.cnames.length)
      }
    } else {

    }
  }

  async structurename(obj) {
    var structuretype = obj.structuretype == null ? "AB" : obj.structuretype;
    var names = obj.names == null ? null : obj.names;//输入的关键字
    var dstr = []
    for (var i = 0; i < structuretype.length; i++) {
      if (dstr.indexOf(structuretype[i]) < 0) {
        dstr.push(structuretype[i])
      }
    }
    obj.namenum = dstr.length;
    var rs = await this.calcname(obj);
    var newrs = []
    if (rs) {
      for (var i = 0; i < rs.length; i++) {
        var sname = []
        for (var j = 0; j < structuretype.length; j++) {
          if (structuretype[j] == "A") {
            sname.push(rs[i][0])
          } else if (structuretype[j] == "B") {
            sname.push(rs[i][1])
          } else if (structuretype[j] == "C") {
            sname.push(rs[i][2])
          } else if (structuretype[j] == "D") {
            sname.push(rs[i][3])
          }
        }
        var newNameStr = sname.join("");
        if (newrs.indexOf(newNameStr) < 0) {
          newrs.push(newNameStr);
        }
      }
    }
    return newrs;
  }

  async fangft() {
    return true;
  }

}
module.exports = CalcnameService;

