<script setup>
import {ref, reactive, onBeforeMount, onMounted, watch} from "vue";
import {getCurrentInstance} from 'vue'
import Sortable from "sortablejs";
import {useStore, mapState} from "vuex";
import {nextTick} from "vue";
import JsonEditorVue from "json-editor-vue3";


// 注册store
const store = useStore()

// 标签相关的定义
const tabsRef = ref(null);  // tabs的Ref
const activeTab = ref(store.state.ecApiModule.first_tab_api_id); // 当前选项卡，存储的是api_id


// 表格相关的定义
const ApiTableRef = ref(null)  // 表格的Ref
// const multipleSelection = ref([])  // checkbox的处理

// 定义变量用于存储接口设置的数据
const UserApiData = ref({api: {}, base_info: {}})

// 表格逻辑
// 多选改变后处理逻辑
function handleParamsChange(newCheckedResult) {
  console.log('handleParamsChange', newCheckedResult)
  console.log('activeTab.value', activeTab.value)
  console.log('UserApiData.value.api[activeTab.value]', UserApiData.value.api[activeTab.value])


}
function handleParamsSelect(val) {
  console.log('val', val)
  UserApiData.value.api[activeTab.value].params.forEach(param => {
    console.log(val.indexOf(param))
    param['is_checked'] = val.indexOf(param) >= 0;
  })
}

// function handleTabChange(){
//   // 标记勾选项
//   markIsRequestSelection()
// }

// 自动勾选行
function markIsChecked() {
  console.log('checkRequestSelection')
  if (UserApiData.value.hasOwnProperty('api') || UserApiData.value.api.length > 0) {
    console.log('UserApiData.value.api[activeTab.value]', UserApiData.value.api[activeTab.value])
    UserApiData.value.api[activeTab.value].params.forEach(item => {
      console.log('item', item)
      if (item['is_checked'] === true) {
        console.log('ApiTableRef.value', ApiTableRef.value)
        ApiTableRef.value[activeTab.value - 1].toggleRowSelection(item, true)
      }
    })
    // console.log(multipleSelection.value)
  }
}

// 初始逻辑数据逻辑处理
function initApiData() {
  UserApiData.value['base_info'] = {
    env: store.state.ecApiModule.ec_api_data.env,
    cinema: store.state.ecApiModule.ec_api_data.cinema,
    channel: store.state.ecApiModule.ec_api_data.channel,
  }
  if (store.state.ecApiModule.ec_api_data.api) {
    store.state.ecApiModule.ec_api_data.api.forEach(item => {
      if (!UserApiData.value['api'].hasOwnProperty(item.id)) {
        UserApiData.value['api'][item.id] = {
          'id': item.id,
          'description': item.description,
          'path': item.path,
          'type': item.type,
          'params': store.state.ecApiModule.ec_api_data.api_params[item.id]
        }
      }
    })
  }
  console.log('initApiData.UserApiData', UserApiData.value)
}

// 监测ec_select_api的变化 如果当前选中的标签被取消勾选，则选择剩下标签的第一个
watch(() => store.state.ecApiModule.ec_api_data.api, (oldValue, newValue) => {
  console.log('watch')
  console.log('store.state.ecApiModule.ec_api_data.api', store.state.ecApiModule.ec_api_data.api)
  initApiData()
  let tempId = 1
  if (newValue.length > 0) {
    tempId = newValue[0].id
  }
  newValue.forEach(item => {
    if (item.id === activeTab.value) {
      tempId = activeTab.value
    }
  })
  activeTab.value = tempId


}, {deep: true})


watch(activeTab, (val) => {
  console.log('watch.activeTab', val)
  markIsChecked()
})
/*
生命周期逻辑
*/
onBeforeMount(
    () => {
      console.log('TabArea onBeforeMount')
      // 处理请求参数生成本地数据结构
      initApiData()
    }
)

// 挂载后
onMounted(() => {
  console.log('TabArea onMounted')
  // 勾选is_checked选项
  markIsChecked()
  // 处理拖拽
  const elTabsHeader = tabsRef.value.$el.querySelector('.el-tabs__header .el-tabs__nav');
  new Sortable(elTabsHeader, {
    animation: 150,
    ghostClass: 'dragging',
    draggable: '.el-tabs__item',
    onEnd: (evt) => {
      store.commit('ecApiModule/handle_sort_ec_select_api', {'newIndex': evt.newIndex, 'oldIndex': evt.oldIndex})
    },
  });
});

// 添加新字段
function addNewParams() {
  UserApiData.value.api[activeTab.value].params.push({
    id: Date.now(),
    api_id: activeTab.value,
    param: '',
    value: '',
    is_request: false,
    is_checked: false
  })
}
</script>

<template>
  <el-tabs ref="tabsRef" v-model="activeTab">
    <el-tab-pane
        v-for="api in Object.values(UserApiData.api)"
        :key="api['id']"
        :label="api['description']"
        :name="api['id']"
    >
      <el-table
          ref='ApiTableRef'
          :data="UserApiData.api[api['id']].params"
          @selection-change="handleParamsChange"
          @select="handleParamsSelect"
      >
        <el-table-column type="selection" width="50"/>
        <el-table-column label="字段名" width="120">
          <template v-slot="scope">
            <span v-if="scope.row.param">{{ scope.row.param }}</span>
            <span v-else><el-input type="text" placeholder="输入字段名" v-model="scope.row.param"></el-input></span>
          </template>
        </el-table-column>
        <el-table-column label="字段值" width="800">
          <template v-slot="scope">
            <el-input type="textarea" placeholder="输入字段值" v-model="scope.row.value" rows="1"
                      v-if="scope.row.value === 'json' && scope.row.param === 'format'" disabled></el-input>
            <el-input type="textarea" placeholder="输入字段值" v-model="scope.row.value" rows="1" v-else></el-input>
          </template>
        </el-table-column>
        <el-table-column label="必选" width="80">
          <template v-slot="scope">
            <span>{{ scope.row.is_request ? '是' : '否' }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="description" label="描述" show-overflow-tooltip/>
      </el-table>
      <el-row class="BtnRow" style="width: 100%">
        <el-col :span="2">
          <el-button type="primary" @click="addNewParams">添加新字段</el-button>
        </el-col>
      </el-row>
      <el-row class="BtnRow" style="width: 100%" :gutter="10">
        <el-col :span="2"><span>请求地址：</span></el-col>
        <el-col :span="12">
          <el-input type="text">1111</el-input>
        </el-col>
        <el-col :span="2">
          <el-button type="primary">发送</el-button>
        </el-col>
        <el-col :span="8">
        </el-col>
      </el-row>
      <!--      <JsonEditorVue class="editor" v-model="json_data" language="zh-CN" @change="handleRunningChange"-->
      <!--                     style="width: 1200px"/>-->
    </el-tab-pane>
  </el-tabs>
</template>

<style scoped>
.BtnRow {
  margin-top: 10px;
}

.editor {
  margin-top: 20px;
}
</style>
