<!-- @format -->

<template>
  <div v-if="editableData" class="editable-cell-input-wrapper">
    <a-input
      :title="editableData.expectedValue"
      v-model:value="editableData.expectedValue"
      @pressEnter="save()" />
    <CheckOutlined :style="{ color: '#37abc4', margin: '0 5px' }" @click="save()" />
    <CloseCircleOutlined :style="{ color: '#37abc4' }" @click="clear()" />
    <br />
    <span v-if="editableData.message" class="config-message">
      <CloseCircleFilled :style="{ color: 'red' }" />{{ editableData.message }}
    </span>
  </div>
  <div v-else class="editable-cell-text-wrapper">
    <span class="config-input">{{ configValue.expectedValue }}</span>
    <EditOutlined :style="{ color: '#37abc4' }" @click="edit()" />
  </div>
</template>
<script lang="ts">
  import { defineComponent, ref } from 'vue';
  import { cloneDeep } from 'lodash-es';
  import {
    CheckOutlined,
    EditOutlined,
    CloseCircleOutlined,
    CloseCircleFilled,
  } from '@ant-design/icons-vue';
  export interface DataItem {
    childName: string;
    remark: string;
    configValue: string;
    expectedValue: string;
    key: string;
    message: string;
    rulesData: object;
  }
  export default defineComponent({
    components: {
      CheckOutlined,
      EditOutlined,
      CloseCircleOutlined,
      CloseCircleFilled,
    },
    props: {
      configValue: {
        type: Object,
      },
      index: {
        type: Number,
      },
      listKey: {
        type: String,
      },
    },
    emits: ['changeInput', 'blur'],
    setup(props, ctx) {
      let editableData = ref();
      let ifShow = ref<boolean>(false);
      //输入框编辑
      const edit = () => {
        // console.log('edit');
        editableData.value = cloneDeep(props.configValue);
        ifShow.value = true;
        console.log(editableData.value);
      };
      //输入框保存
      const save = () => {
        // console.log('save');
        let dataType = editableData.value.childSpecsDTO;
        validatorRules();
        if (validatorRules()) {
          let value = {
            configValue: editableData.value.expectedValue,
            index: props.index,
            key: props.listKey,
          };
          if (dataType.dataType == 'INT') {
            value.configValue = parseInt(value.configValue);
          }
          ctx.emit('changeInput', value);
          editableData.value = '';
        } else {
        }
      };
      //校验规则
      const validatorRules = () => {
        // console.log('校验规则');
        let rulesData = editableData.value.childSpecsDTO;
        let value = editableData.value.expectedValue;
        // console.log(rulesData);
        // console.log(value);
        if (rulesData['min'] && rulesData['max']) {
        }
        const min = parseInt(rulesData['min']);
        const max = parseInt(rulesData['max']);
        // if (value == '') {
        //   editableData.value.message = '不可以为空';
        //   return false;
        // }
        if (rulesData.dataType == 'TEXT') {
          if (value.length > rulesData.length) {
            editableData.value.message = '字符串长度最大不超过' + rulesData.length;
            // console.log('字符串长度最大不超过' + rulesData.length);
            return false;
          } else {
            return true;
          }
        } else if (rulesData.dataType == 'DOUBLE') {
          value = value + '';
          if (value.length > 100) {
            editableData.value.message = 'double类型支持最大位数为100';
            return false;
          }
          if (!/^(-)?[0-9]+\.?([0-9]{0,16})?$/.test(value)) {
            editableData.value.message = '双精度有效位为16';
            return false;
          }
          if (value > max || value < min) {
            editableData.value.message = ''.concat(`取值范围:${min} ~ ${max}`);
            return false;
          }
          return true;
        } else if (rulesData.dataType == 'FLOAT') {
          if (!/^(-)?[0-9]+\.?([0-9]{0,7})?$/.test(value)) {
            editableData.value.message = '单精度有效位为7';
            return false;
          }
          if (value > max || value < min) {
            editableData.value.message = ''.concat(`取值范围:${min} ~ ${max}`);
            return false;
          }
          return true;
        } else if (rulesData.dataType == 'INT') {
          value = value.toString();
          value = value.split('.');
          if (value.length <= 1) {
            value = parseInt(value);
            if (typeof value === 'number' && value % 1 === 0) {
              if (value < min || value > max) {
                editableData.value.message = `取值范围:${min} ~ ${max}`;
                return false;
              } else {
                return true;
              }
            } else {
              editableData.value.message = '请输入正确的整数类型';
              return false;
            }
          } else {
            editableData.value.message = '请输入正确的整数类型';
            return false;
          }
        } else {
          return true;
        }
      };
      //关闭输入框内容
      const clear = () => {
        editableData.value = '';
      };
      return {
        save,
        clear,
        edit,
        editableData,
      };
    },
  });
</script>
<style scoped>
  :deep(.editable-cell-input-wrapper input) {
    width: 150px;
  }

  .config-message {
    color: red;
  }
  .editable-cell-text-wrapper {
    width: 70%;
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
</style>