import baseX from 'base-x';
import { apiRequest, qqCw } from '../utils/request';
import { isJSON } from '@/webPublic/zyd_public/utils/utils';
import { queryApiActionPath, queryIsSafe } from '@/webPublic/one_stop_public/utils/queryConfig';
import { getToken, getUserInfo } from '@/webPublic/one_stop_public/utils/token';
import encryptApiList from './encryptApiList';
import { uploadFile } from '@/webPublic/one_stop_public/libs/PictureSignature/ShowItem';
import { deepCopy } from '@/webPublic/one_stop_public/utils/myutils';

var BASE16 = '0123456789abcdef';
var bs16 = baseX(BASE16);

function checkOpenBase16() {
  const is_open_base14 = sessionStorage.getItem('is_open_base16')
    ? JSON.parse(sessionStorage.getItem('is_open_base16'))
    : false;
  return is_open_base14;
}

export function Base16Encode(value) {
  const is_open_base14 = checkOpenBase16();
  if (is_open_base14) {
    if (!value) {
      return null;
    } else {
      let newV = new Buffer(value); // 快
      const r = bs16.encode(newV); // 慢
      return r;
    }
  }
  return value;
}

const giveKey = (key, datas) => {
  if (datas && datas[key]) {
    datas[key] = Base16Encode(datas[key]);
  }
  return datas;
};

const countAllValues = async (datas, item) => {
  if (item.setNull) {
    datas.allValues = JSON.stringify({});
  } else {
    if (item.query) {
      if (datas?.sqlKey.length < 13) {
        const response = await apiRequest('/SqlManageEntityApi/findParamsKey', {
          sqlKey: datas.sqlKey,
        });
        if (!response || (Array.isArray(response) && response.length === 0)) {
          datas.allValues = JSON.stringify({});
        } else {
          const x = (isJSON(datas.allValues) && JSON.parse(datas.allValues)) || {};
          const y = {};
          for (let i of response) {
            if (x[i]) {
              y[i] = x[i];
            }
            datas.allValues = JSON.stringify(y);
          }
        }
      } else {
        datas.allValues = JSON.stringify({});
      }
    }
  }
  return datas;
};

export function requestFileInfo(url, datas) {
  const formData = new FormData();
  if (getToken()) {
    datas.token = getToken();
  }
  for (let key in datas) {
    formData.append(key, datas[key]);
  }
  if (!url || typeof url !== 'string') {
    console.log(url);
    return false;
  }
  return fetch(url && url.indexOf('http') > -1 ? url : queryApiActionPath() + url, {
    headers: {
      Accept: 'application/json',
      // Authorization: `bearer ${getToken()}`,
    },
    method: 'POST',
    credentials: 'omit',
    mode: 'cors',
    body: formData,
  })
    .then(res => {
      if (res.status === 401) {
        qqCw({
          title: '登录过期401',
          customErrMsg: '登录已过期，请重新登录',
        });
        return false;
      }
      console.log(res.status);
      return res.json();
    })
    .then(res => {
      // console.log(res);
      if (res && res.errCode && res.message) {
        qqCw({
          msg: res.errMsg,
          customErrMsg: res.customErrMsg,
        });
        return false;
      }
      return res;
    });
}


export function giveFilePostDataInfoForTrue(datas, url) {
  const getUserInfo = () => {
    let x = localStorage.getItem('user');
    if (isJSON(x)) {
      x = JSON.parse(x);
      return x;
    } else {
      return {
        groupsId: 'pub',
      };
    }
  };

  if (!window.CONFIG?.IS_SAFE) {
    return {
      datas,
      url,
    };
  }
  datas = deepCopy(datas);
  // console.log(datas);
  for (let i in datas) {
    if (datas[i] === null || (Array.isArray(datas[i]) && datas[i].length === 0) || datas[i] === undefined) {
      delete datas[i];
    }
  }
  if (url) {
    const roleGroup = getUserInfo().groupsId;
    if (url.indexOf('http') > -1) {
      url = url.replace('/onestop/', `/onestop/safe/${roleGroup}/`);
    } else {
      url = url.replace(url, `/safe/${roleGroup}/` + url);
      url = url.replaceAll('//', '/');
    }
    // console.table({
    //   datas,
    //   url,
    // });
    let file = new File([JSON.stringify(datas)], 'fileParams.jpeg', {
      type: 'image/jpeg',
    });
    datas = {
      fileParams: file,
    };
    return {
      datas,
      url,
    };
  }
}


function giveFilePostData(datas, url) {
  for (let i in datas) {
    if (datas[i] === null || (Array.isArray(datas[i]) && datas[i].length === 0) || datas[i] === undefined) {
      delete datas[i];
    }
  }
  if (url && typeof url === 'string') {
    for (let item of encryptApiList) {
      if (url.indexOf(item.api) > -1) {
        const roleGroup = getUserInfo().groupsId;
        if (url.indexOf('http') > -1) {
          url = url.replace('/onestop/', `/onestop/safe/${roleGroup}/`);
        } else {
          url = url.replace(url, `/safe/${roleGroup}/` + url);
          url = url.replaceAll('//', '/');
        }
        // console.table({
        //   datas,
        //   url,
        // });
        let file = new File([JSON.stringify(datas)], 'fileParams.jpeg', {
          type: 'image/jpeg',
        });
        // uploadFile(file);
        datas = {
          fileParams: file,
        };
        return new Promise((resolve, reject) => {
          resolve({
            datas,
            url,
          });
        });
      }
    }
  }
  return new Promise((resolve, reject) => {
    resolve(datas);
    return datas;
  });
}

export async function giveBase16EnCode(datas, url) {
  // 全局加解密函数.
  if (queryIsSafe()) {
    return giveFilePostData(datas, url);
  }
  if (!checkOpenBase16()) {
    return datas;
  }
  if (url && typeof url === 'string') {
    for (let item of encryptApiList) {
      if (url.indexOf(item.api) > -1) {
        for (let g of item.key) {
          if (datas[g] && item.filterEmpty && item.filterEmpty.includes(g)) {
            // 压缩代码功能暂时屏蔽
            /***
             // console.log(datas[g]);
             // console.log('%c加密数据压缩前字段' +  g + '= ', 'color: red;');
             // console.log('%c'+ datas[g] , 'color: red;');
             // datas[g] = datas[g].replace(/\r/g, ' ').replace(/\t/g, ' ').replace(/\n/g, ' ').replace(/\s\s+/g, ' ');
             // console.log('%c加密数据压缩后字段' +  g + '= ', 'color: orange;');
             // console.log('%c'+ datas[g] , 'color: orange;');
             ***/
          }

          if (g === 'allValues' && typeof datas[g] !== 'undefined') {
            datas = await countAllValues(datas, item); // 循环中 不要写await
            datas = giveKey('allValues', datas);
          } else {
            // console.log(g, datas);
            datas = giveKey(g, datas);
          }
        }

        if (item.yinShe) {
          // 映射参数字段.
          datas.isBase = true;
          for (let oldKey in item.yinShe) {
            let newKey = item.yinShe[oldKey];
            // if(typeof datas[oldKey] !== 'undefined'){
            datas[newKey] = datas[oldKey];
            delete datas[oldKey];
            // }
          }
        }
        return datas;
      }
    }
  }
  return datas;
}
