<template>
  <Mask :width="400" :height="600" :is-show="isShow" @close="isShow=false" :show-footer="true" title="商品类型">
    <el-table
        :data="cateList"
        style="width: 100%"
    >
      <el-table-column
          width="200">
        <template #default="scope">
          <el-input v-model="scope.row.name" v-if="scope.row.isEdit"></el-input>
          <span v-else>{{ scope.row.name }}</span>
        </template>
      </el-table-column>
      <el-table-column>
        <template #default="scope">
          <div>
            <div v-if="scope.row.isAdd" style="display: flex;">
              <span class="small-btn" @click="saveDo">确定</span>
              <span class="small-btn" @click="cancelAdd" style="margin-left: 24px">取消</span>
            </div>
            <div v-else>
              <span @click="move(-1,scope.row)" class="btn"><el-icon><ArrowUpBold/></el-icon></span>
              <span @click="move(1,scope.row)" class="btn"><el-icon><ArrowDownBold/></el-icon></span>
              <span @click="scope.row.isEdit=true" class="btn" id="edit"><el-icon><Edit/></el-icon></span>
              <span @click="getCountByCateId(scope.row.id)" class="btn"> <el-icon><Delete/></el-icon></span>
            </div>
          </div>
        </template>
      </el-table-column>
    </el-table>
    <template #footer>
      <div class="bottom">
        <span class="default-btn" @click="add" id="add">添加</span>
        <span class="default-btn" @click="save" style="margin-left: 24px">保存</span>
      </div>
    </template>
  </Mask>

</template>
<script setup lang="ts">
import {onMounted, onUnmounted, ref} from "vue";
import {post} from "@/utils/request.ts";
import {ElMessageBox} from "element-plus";
import Mask from "@/components/common/Mask.vue";
import {ArrowUpBold, ArrowDownBold, Delete, Edit} from "@element-plus/icons-vue";

const props = defineProps({
  type: {
    type: Number,
  },
})

interface CateItem {
  id?: number;
  name: string;
  type: number | undefined;
  isEdit: boolean;
  isAdd: boolean;
  sort: number;
}

const cateList = ref<CateItem[]>([]);
const getCateList = () => {
  post("goods/cate/list", {type: props.type}).then((res: any) => {
    cateList.value = res
  })
}
onMounted(() => {
  getCateList()
  document.addEventListener("click", handleClickOutside);
})
onUnmounted(() => {
  document.removeEventListener("click", handleClickOutside);
})
const handleClickOutside = (event: MouseEvent) => {
  const target = event.target as HTMLElement;
  if (!target.closest('.el-input') && !target.closest('#edit') && !target.closest('#add')) {
    cateList.value.forEach(item => {
      item.isEdit = false;
    });
  }
};
const emit = defineEmits(['close'])
const close = () => {
  isShow.value = false
  emit('close')
}
const isShow = ref<any>(false)
const getCountByCateId = (cateId: any) => {
  let count = 0;
  post("goods/goods/getByCateId", {cateId: cateId}).then((res: any) => {
    count = res
    ElMessageBox.confirm(
        `有${count}个西药属于该二级分类，删除后将一同清空西药的分类。是否确定删除？`,
        'Warning',
        {
          confirmButtonText: '确认删除',
          cancelButtonText: '取消',
          type: 'warning',
        }
    ).then(() => {
      del(cateId)
    })
  })


}
const del = async (id: any) => {
  await post("goods/cate/del", {id})
  getCateList()
}
const saveDo = async () => {
  cateList.value.forEach((item, index) => {
    item.sort = index + 1
    if (item.name === '') {
      removeItemByIndex(index)
    }

  })
  if (cateList.value.length === 0) return
  await post("goods/cate/save", {cateList: cateList.value})
  getCateList()
}
const init = () => {
  isShow.value = true
  getCateList()
}
defineExpose({init})
const save = () => {
  saveDo()
  close()
}
const removeItemByIndex = (index: number) => {
  if (index >= 0 && index < cateList.value.length) {
    cateList.value.splice(index, 1);
  }
}
// const save = async ()=>{
//   await post("goods/cate/save",cateList.value)
//   getCateList()
// }

const add = () => {
  const newCate: CateItem = {
    name: '',
    type: props.type,
    isEdit: true,
    isAdd: true,
    sort: cateList.value.length + 1
  }
  cateList.value.push(newCate)
}
//移动 -1上移 1下移
const move = (direction: number, row: any) => {
  const index = cateList.value.findIndex(item => item.id === row.id);
  if (index === -1) return;
  const targetIndex = index + direction;
  if (targetIndex < 0 || targetIndex >= cateList.value.length) return;
  // 交换元素位置
  [cateList.value[index], cateList.value[targetIndex]] = [cateList.value[targetIndex], cateList.value[index]];

}
const cancelAdd = () => {
  cateList.value.pop()
}
</script>
<style scoped lang="scss">
.close {
  cursor: pointer;
  position: absolute;
  top: 10px;
  right: 10px;
  font-size: 24px;
  z-index: 1999;
}

.btn {
  margin-left: 10px;
  cursor: pointer;
}

.bottom {
  height: 100%;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  padding: 0 24px;
}
</style>