<template>
  <div class="box">
    <div class="search-form">
      <QueryForm :is-show-tab="false" :ai-options="aiOptions" :manual-options="manualOptions"
        :location-options="locationOptions" @on-search="handleSearch" @on-reset="handleReset" />
    </div>
    <div class="table-list">
      <div v-if="showActionBar" class="action-bar">
        <span class="num-text">已选{{ chooseNum }}项</span>
        <el-button :class="isActiveHide ? 'btn-active' : 'btn-normal'" @click="handleHideAll">全部隐藏</el-button>
        <el-button :class="isActiveDelete ? 'btn-active' : 'btn-normal'" @click="handleDeleteAll">删除</el-button>
        <el-button :class="isActiveUrgent ? 'btn-active' : 'btn-normal'" @click="handleUrgentAll">标记加急</el-button>
        <el-button :class="isActiveCopy ? 'btn-active' : 'btn-normal'" @click="handleCopyToShow">复制到展示数据</el-button>
        <span class="close-btn" @click="handleSelectNone"></span>
      </div>
      <AlertTable ref="alertTableRef" class="table-bar" :is-show-tab="false" :table-data="tableData"
        :on-detail="handleDetail" :on-urgent="handleUrgent" :on-show="handleShow" :on-delete="handleDelete"
        @update:selection="handlePop" />
    </div>
    <div class="pagination-box">
      <Pagination v-model:page="query.pageNumber" v-model:size="query.pageSize" :total="total"
        @update:page="handlePageChange" @update:size="handleSizeChange" />
    </div>
    <DetailDialog :show-drawer="isDetailDialogShow" :description="detailDescription" :image-paths="detailPictures"
      @toggle-status="switchDetailDialog" />
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted, onBeforeMount } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import QueryForm from '../common/QueryForm.vue';
import AlertTable from '../common/AlertTable.vue';
import DetailDialog from '../common/DetailDialog.vue';
import Pagination from '../common/Pagination.vue';
import { useIssueType } from '../../hooks/useIssueType';
import { useWorkLocation } from '../../hooks/useWorkLocation';
import {
  getDefaultTableData,
  updateDefaultTableData,
  deleteDefaultTableData,
  copyToShowTableData
} from '@/api/datamanagement/alert-default';

const { aiOptions, manualOptions, getAIOptions, getManualOptions } = useIssueType();
const { locationOptions, getLocationOptions } = useWorkLocation();

const alertTableRef = ref<typeof AlertTable>();
const tableData = ref([]);
const showActionBar = ref(false);
const chooseNum = ref(0);
const chooseId = ref<number[]>([]);
const isActiveHide = ref(false);
const isActiveDelete = ref(false);
const isActiveUrgent = ref(false);
const isActiveCopy = ref(false);
// 详情
const isDetailDialogShow = ref(false);
const detailDescription = ref('');
const detailPictures = ref<string[]>([]);
// 分页
const total = ref(0);

const query = ref({
  pageNumber: 1,
  pageSize: 10
});
// 查询
const handleSearch = (queryForm) => {
  query.value = queryForm;
  getTableData();
};
// 重置
const handleReset = (queryForm) => {
  query.value = queryForm;
  getTableData();
};

// 多选
const handlePop = (selection) => {
  selection.forEach((item) => {
    if (chooseId.value.indexOf(item.id) === -1)
      chooseId.value.push(item.id);
  });
  chooseNum.value = selection.length;
  showActionBar.value = chooseNum.value > 0 ? true : false;
};
// 取消多选
const handleSelectNone = () => {
  chooseNum.value = 0;
  alertTableRef.value?.clearAll();
  showActionBar.value = false;
};

// 全部隐藏
const handleHideAll = () => {
  if (showActionBar.value) isActiveHide.value = !isActiveHide.value;
  const updateList = {
    id: chooseId.value,
    hide: true,
  };
  updateDefaultTableData(updateList).then(() => {
    getTableData();
    isActiveHide.value = !isActiveHide.value;
  });
};

// 批量删除
const handleDeleteAll = () => {
  if (showActionBar.value) isActiveDelete.value = !isActiveDelete.value;
  ElMessageBox.confirm(
    '删除之后，数据无法恢复',
    '请确认是否删除数据',
    {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning',
      customClass: 'deleteMessage',
      center: true
    }
  )
    .then(() => {
      deleteDefaultTableData(chooseId.value).then(() => {
        ElMessage({
          type: 'success',
          message: '删除成功',
        });
        getTableData();
        isActiveDelete.value = !isActiveDelete.value;
      })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: '取消删除',
      });
      isActiveDelete.value = !isActiveDelete.value;
    })
};

// 标记加急，设置priority = 1
const handleUrgentAll = () => {
  if (showActionBar.value) isActiveUrgent.value = !isActiveUrgent.value;
  const updateList = {
    id: chooseId.value,
    priority: 1,
  };
  updateDefaultTableData(updateList).then(() => {
    getTableData();
    isActiveUrgent.value = !isActiveUrgent.value;
  });
};

// 复制到展示数据
const handleCopyToShow = () => {
  if (showActionBar.value) isActiveCopy.value = !isActiveCopy.value;
  copyToShowTableData(chooseId.value).then(() => {
    ElMessage({
      message: '复制成功！',
      type: 'success',
    });
    setTimeout(function () {
      isActiveCopy.value = !isActiveCopy.value;
    }, 1000);
  })
};

// 详情
const switchDetailDialog = (show: boolean) => {
  isDetailDialogShow.value = show;
};
const handleDetail = (row) => {
  isDetailDialogShow.value = true;
  detailDescription.value = row.description;
  detailPictures.value = row.pictures;
};

// 单个加急priority=1/取消加急priority=0
const handleUrgent = (row) => {
  const tempPriority = row.priority === 0 ? 1 : 0;
  const updateList = {
    id: [row.id],
    priority: tempPriority,
  };
  updateDefaultTableData(updateList).then(() => {
    getTableData();
  });
};

// 单个显示hide=false/隐藏hide=true
const handleShow = (row) => {
  const tempHide = row.isHide === false ? true : false;
  const updateList = {
    id: [row.id],
    hide: tempHide,
  };
  updateDefaultTableData(updateList).then(() => {
    getTableData();
  });
};

// 删除
const handleDelete = (row) => {
  ElMessageBox.confirm(
    '删除之后，数据无法恢复',
    '请确认是否删除数据',
    {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning',
      customClass: 'deleteMessage',
      center: true
    }
  )
    .then(() => {
      deleteDefaultTableData([row.id]).then(() => {
        ElMessage({
          type: 'success',
          message: '删除成功',
        });
        getTableData();
      })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: '取消删除',
      })
    })
};

// 换页，重新获取表格
const handlePageChange = (val) => {
  query.value.pageNumber = val;
  getTableData();
};
const handleSizeChange = (val) => {
  query.value.pageSize = val;
  getTableData();
};

const getTableData = () => {
  getDefaultTableData(query.value).then((res) => {
    console.log(res);
    tableData.value = res.records;
    total.value = res.totalRow;
  })
};

onMounted(() => {
  getTableData();
});

onBeforeMount(() => {
  getAIOptions();
  getManualOptions();
  getLocationOptions();
});
</script>

<style scoped lang="scss">
.box {
  display: flex;
  flex-direction: column;
}

.table-list {
  height: calc(100vh - 400px);
  overflow-y: scroll;

  .action-bar {
    display: flex;
    align-items: center;
    position: absolute;
    min-width: calc(100vw - 266px);
    height: 50px;
    border-radius: 4px 4px 0px 0px;
    background-color: #DDEFFF;
    z-index: 10;

    .num-text {
      margin: 0 34px 0 25px;
      color: rgba(0, 0, 0, 0.85);
      font-weight: 500;
    }

    .btn-normal {
      color: #1890FF;
      background: transparent;
      border: 1px solid #1890FF;
      border-radius: 2px;
    }

    .btn-active {
      color: #FFFFFF;
      background-color: #1890FF;
    }

    .close-btn {
      margin-left: auto;
      margin-right: 20px;
    }

    .close-btn:before {
      content: '\2716';
      color: #000;
      cursor: pointer;
    }
  }

  .table-bar {
    position: relative;
  }
}

.pagination-box {
  height: 50px;
  margin-top: 10px;
}
</style>
<style lang="scss">
.deleteMessage {
  padding: 20px 24px;
  box-shadow: 0px 12px 48px 16px rgba(0, 0, 0, 0.03), 0px 9px 28px 0px rgba(0, 0, 0, 0.05), 0px 6px 16px -8px rgba(0, 0, 0, 0.08);
  border-radius: 8px;

  .el-message-box__headerbtn {
    margin-top: 12px;
    margin-right: 12px;
  }

  .el-message-box__title {
    justify-content: start;
    color: rgba(0, 0, 0, 0.88);
    font-size: 16px;
    font-weight: 500;
  }

  .el-message-box__container {
    justify-content: start;
    margin-left: 23px;
  }

  .el-message-box__btns {
    display: block;
    float: right;
  }
}
</style>