<!-- @format -->

<template>
  <a-spin :spinning="spinning">
    <div class="ns-skeleton">
      <ns-page-header class="ns-page-header">
        <template #title>
          <div class="title" @click="onBack()">
            <ns-icon name="left" /> <div class="text">配置</div>
          </div>
        </template>
      </ns-page-header>
      <div class="ns-config">
        <div v-for="(configGroup, index) in getConfig" :key="index">
          <a-descriptions style="height: 46px" :style="{ 'margin-top': index ? '16px' : '0px' }">
            <template #title>
              <div class="descriptions-title config-name">
                <span>{{ configGroup.name }}</span>
                <div class="titleFloor"></div>
                <ns-button
                  v-if="paramsValue?.deviceName"
                  style="float: right"
                  type="primary"
                  @click="updateSubmit(paramsValue)"
                  :disabled="!paramsValue"
                  >保存</ns-button
                >
              </div>
            </template>
          </a-descriptions>
          <NsBasicTable
            ref="dataRef"
            :data-source="configGroup.getBindValues"
            :columns="configGroup.columns"
            :pagination="false"
            :rowKey="configGroup.getBindValues.key">
            <template #bodyCell="{ record, column, text }">
              <template v-if="column.dataIndex == 'expectedValue'">
                <!-- //文本编辑 -->
                <div
                  class="editable-cell"
                  v-if="configGroup.getBindValues[record.key - 1].childDataType === 'TEXT'">
                  <!-- 日期组件 -->
                  <div v-if="configGroup.getBindValues[record.key - 1].sign == 'timeRange'">
                    <configDate
                      v-model:timeValue="configGroup.getBindValues[record.key - 1]"
                      :index="index"
                      :listKey="record.key"
                      :text="text"
                      @changeDate="changeData" />
                  </div>
                  <!-- 普通文本 -->
                  <div v-else>
                    <configInput
                      v-model:configValue="configGroup.getBindValues[record.key - 1]"
                      :index="index"
                      :listKey="record.key"
                      @changeInput="changeData" />
                  </div>
                </div>
                <!-- 枚举 -->
                <div
                  v-else-if="
                    configGroup.getBindValues[record.key - 1].childDataType == 'ENUM' ||
                    configGroup.getBindValues[record.key - 1].list?.[0].dataType == 'ENUM'
                  ">
                  <configEnum
                    v-model:configValue="configGroup.getBindValues[record.key - 1]"
                    :index="index"
                    :listKey="record.key"
                    @changeEnum="changeData" />
                </div>
                <!-- 开关 -->
                <div v-else-if="configGroup.getBindValues[record.key - 1].childDataType == 'BOOL'">
                  <configSwitch
                    v-model:configValue="configGroup.getBindValues[record.key - 1]"
                    :index="index"
                    :listKey="record.key"
                    @changeSwitch="changeData" />
                </div>
                <!-- 校验float/int/double -->
                <div
                  v-else-if="
                    configGroup.getBindValues[record.key - 1].childDataType == 'FLOAT' ||
                    'INT' ||
                    'DOUBLE'
                  ">
                  <configInput
                    v-model:configValue="configGroup.getBindValues[record.key - 1]"
                    :index="index"
                    :listKey="record.key"
                    @changeInput="changeData" />
                </div>
                <!-- else -->
                <div v-else> </div>
              </template>
            </template>
          </NsBasicTable>
        </div>
      </div>
    </div>
  </a-spin>
</template>

<script lang="ts">
  import { computed, defineComponent, ref, watch, PropType, UnwrapRef, reactive } from 'vue';
  import { http } from '/nerv-lib/util/http';
  import { useRouter } from 'vue-router';
  import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
  import { message } from 'ant-design-vue';
  import configDate from './configDate.vue';
  import configInput from './configInput.vue';
  import configEnum from './configEnum.vue';
  import configSwitch from './configSwitch.vue';
  import { Handle } from '@antv/x6/lib/addon/common';

  export interface DetailItem {
    label: string;
    name: string;
    value?: string;
    format?: Function;
    type?: string; // 现支持image
  }
  export interface ConfigGroup {
    title: string;
    items: Array<DetailItem>;
  }
  export interface ComponentValueItem {
    configValue: object | string;
    key: number;
    index: number;
  }
  export default defineComponent({
    name: 'NsViewConfig',
    props: {
      config: {
        type: Array as unknown as PropType<ConfigGroup>,
        default: () => [],
      },
      api: {
        type: String,
      },
      updateApi: {
        type: String,
      },
      params: {
        type: Object,
      },
      columns: {
        type: Array,
      },
    },
    // eslint-disable-next-line vue/order-in-components
    components: {
      ExclamationCircleOutlined,
      configDate,
      configInput,
      configEnum,
      configSwitch,
    },
    setup(props) {
      const checked = ref<boolean>(true);
      const tableData = ref([]);
      const router = useRouter();
      const dataRef = ref([]);
      const spinning = ref(false);
      let hasTypeEight = ref();
      let paramsValue = ref();
      //接收子组件传过来的数据并处理
      const changeData = (value: ComponentValueItem) => {
        console.log(value);
        getConfig.value[value.index].getBindValues[value.key - 1].expectedValue = value.configValue;
        if (getConfig.value[value.index].getBindValues[value.key - 1].configItemList) {
          hasTypeEight.value = true;
          getConfig.value[value.index].getBindValues[value.key - 1].configItemList.value =
            value.configValue;
        } else {
          hasTypeEight.value = false;
          getConfig.value[value.index].getBindValues[value.key - 1].itemList.value =
            value.configValue;
        }

        updateConfig(value.index, hasTypeEight.value);
      };
      function request() {
        const { query } = router.currentRoute.value;
        http.get(props.api, query).then((res) => {
          dataRef.value = res.data;
        });
      }
      request();
      //所有类型修改后数据提交
      const updateConfig = (index: number, isTrue) => {
        ///api/objs/Device/ConfigUpdate
        console.log(index);
        console.log(getConfig.value[index].getBindValues);
        let configItemList = [];
        let itemList = [];
        for (const iterator of getConfig.value[index].getBindValues) {
          configItemList.push(iterator.configItemList);
          itemList.push(iterator.itemList);
        }

        let params = {};
        if (isTrue) {
          params = {
            deviceName: props.params.deviceName,
            itemStructList: [
              {
                configItemList: configItemList,
                structIdentifier: getConfig.value[index].identifier,
              },
            ],
            uuid: props.params.uuid,
          };
          paramsValue.value = params;
          return;
        } else {
          params = {
            deviceName: props.params.deviceName,
            itemList: itemList,
            uuid: props.params.uuid,
          };
        }
        updateSubmit(params);

        // http.post(props.updateApi, params).then((res) => {
        //   if (res.code == '200') {
        //     spinning.value = true;
        //     message.success('操作成功');
        //     getConfig;
        //     setTimeout(() => {
        //       request();
        //       spinning.value = false;
        //     }, 3000);
        //   }
        // });

        return 1;
      };
      const updateSubmit = (params) => {
        http.post(props.updateApi, params).then((res) => {
          if (res.code == '200') {
            spinning.value = true;
            message.success('操作成功');
            getConfig;
            setTimeout(() => {
              request();
              spinning.value = false;
            }, 3000);
          }
        });
      };

      //处理后端传过来的数据
      const getConfig = computed(() => {
        if (dataRef.value) {
          return dataRef.value.map((item) => {
            if (!item.dataSpecsList) {
              item.dataSpecsList = item.dataSpecs;
            }
            let bindValues = JSON.parse(item.dataSpecsList);
            if (item.dataType == 4) {
              bindValues = [{ list: bindValues, remark: item.remark, childName: item.name }];
            }
            if (!Array.isArray(bindValues)) {
              bindValues = [
                { childSpecsDTO: bindValues, remark: item.remark, childName: item.name },
              ];
            }
            let i = 1;

            for (const iterator of bindValues) {
              if (
                iterator.childDataType == 'INT' ||
                iterator.childDataType == 'BOOL' ||
                iterator.childDataType == 'ENUM'
              ) {
                if (item.dataType == 8) {
                  iterator.expectedValue = parseInt(iterator.configValue);
                } else {
                  iterator.expectedValue = parseInt(item.expectedValue);
                }
              } else {
                if (item.dataType == 8) {
                  iterator.expectedValue = iterator.configValue;
                } else {
                  iterator.expectedValue = item.expectedValue;
                }
              }

              if (item.dataType == 8) {
                let demo = {
                  identifier: iterator.identifier,
                  value: iterator.expectedValue,
                };
                iterator.configItemList = demo;
              } else {
                let demoCopy = {
                  identifier: item.identifier,
                  value: iterator.expectedValue,
                };
                iterator.itemList = demoCopy;
              }

              iterator.key = i + '';
              i += 1;
            }

            return {
              // title: group.title,
              name: item.name,
              identifier: item.identifier,
              getBindValues: bindValues,
              columns: props.columns,
            };
          });
        }
        return [];
      });
      return {
        getConfig,
        tableData,
        checked,
        updateConfig,
        changeData,
        spinning,
        paramsValue,
        updateSubmit,
      };
    },

    methods: {
      onBack() {
        this.$router.go(-1);
      },
    },
  });
</script>

<style lang="less" scoped>
  :deep(.ant-skeleton-paragraph) {
    display: inline;
    // display: flex;
    // flex-wrap: wrap;
  }

  :deep(.ant-skeleton-paragraph li:nth-child(n)) {
    float: left;
    display: inline;
    margin-right: 130px;
    margin-top: 16px;
    margin-bottom: 4px;
  }

  :deep(.ant-skeleton-paragraph li:nth-child(3n + 1)) {
    clear: both;
    display: inline;
  }

  :deep(.ant-skeleton-content) {
    padding: 0px 8px 10px 10px;
  }

  .ns-detail {
    padding: 0px 8px 10px 10px;
  }

  :deep(.ant-table) {
    border: 1px solid #ededed;
    border-bottom: none;
  }

  :deep(.editable-cell-input-wrapper input) {
    width: 150px;
  }

  :deep(.ant-modal-content) {
    border: 1px solid #dcdfe2;
    box-shadow: none;
  }

  .config-input {
    width: 100px;
  }

  .config-name {
    color: rgba(0, 0, 0, 0.85);
    font-weight: bold;
    font-size: 16px;
    margin: 16px 0;
    height: 30px;
  }

  .config-message {
    color: red;
  }

  .config-message span svg {
    color: red;
  }
  .ns-config {
    padding: 16px;
    border-top: 16px solid #e5ebf0;
    div:first-child {
      .config-name {
        margin-top: 0px;
      }
    }
    :deep(.ns-basic-table) {
      padding-top: 0px;
    }
  }
  // .ns-skeleton .ns-page-header {
  //   margin-bottom: 0 !important;
  // }

  .ns-view {
    min-height: 100%;
    height: 100%;
    background: #e5ebf0;
  }
  :deep(.ant-spin-nested-loading) {
    min-height: 100%;
    height: 100%;
  }
  :deep(.ant-spin-container) {
    min-height: 100%;
    height: 100%;
  }
  :deep(.ant-divider) {
    display: none;
  }
  .ns-page-header {
    margin-bottom: 0 !important;
    padding: 7px 16px !important;
    width: calc(100% + 32px);
    margin-left: -16px;
    .title {
      cursor: pointer;
      font-size: 18px !important;
      display: flex;
      align-items: center;
      .text {
        margin-left: 6px;
      }
    }
  }
  .config-name {
    // span:after {
    //   content: '';
    //   width: 75px;
    //   height: 7px;
    //   display: block;
    //   background: linear-gradient(90deg, @primary-color 0%, #fff 82.67%);
    //   margin-left: 2px;
    //   margin-top: -7px;
    // }
  }
  .ns-add-form {
    border-top: 16px solid #e5ebf0;
    padding: 16px 21px;
    background: #fff;
    height: calc(100% - 47px);
    :deep(.ns-form) {
      .ns-form-item .ns-form-body .ns-child-form-title {
        padding-top: 0;
      }
      &:after {
        display: none;
      }
    }
  }
  :deep(.ns-form.ns-vertical-form) {
    padding-top: 16px !important;
  }
</style>
