<template>
  <div
    class="inspect-route-page grid grid-cols-[auto_1fr] grid-rows-[auto_1fr] gap-4 h-[calc(100vh-20px-var(--top-tool-height)-var(--tags-view-height)-var(--app-footer-height))]">
    <DeptTreeSelect
      :top-id="rootDeptId"
      :deptId="deptId"
      v-model="queryParams.deptId"
      :init-select="false"
      :show-title="false"
      request-api="getSimpleDeptList"
      class="inspect-route-tree row-span-2"
      @node-click="handleDeptNodeClick" />

    <el-form
      ref="queryFormRef"
      :model="queryParams"
      size="default"
      label-width="88px"
      class="inspect-route-query bg-white dark:bg-[#1d1e1f] rounded-lg shadow px-6 py-3 min-w-0">
      <div class="query-row">
        <el-form-item :label="t('route.RouteName')" prop="routeName">
          <el-input
            v-model="queryParams.routeName"
            :placeholder="t('route.nHolder')"
            clearable
            class="query-control"
            @keyup.enter="handleQuery" />
        </el-form-item>
        <el-form-item :label="t('monitor.category')" prop="deviceClassify">
          <el-tree-select
            v-model="queryParams.deviceClassify"
            :data="productClassifyList"
            :props="defaultProps"
            check-strictly
            node-key="id"
            :placeholder="t('deviceForm.categoryHolder')"
            filterable
            clearable
            class="query-control" />
        </el-form-item>
        <el-form-item :label="t('monitor.deviceName')" prop="deviceName">
          <el-input
            v-model="queryParams.deviceName"
            :placeholder="t('iotDevice.nameHolder')"
            clearable
            class="query-control"
            @keyup.enter="handleQuery" />
        </el-form-item>
      </div>

      <el-form-item class="query-actions">
        <el-button type="primary" @click="handleQuery">
          <Icon icon="ep:search" class="mr-5px" />{{ t('file.search') }}
        </el-button>
        <el-button @click="resetQuery">
          <Icon icon="ep:refresh" class="mr-5px" />{{ t('file.reset') }}
        </el-button>
        <el-button
          type="primary"
          plain
          @click="openForm('create')"
          v-hasPermi="['rq:iot-inspect-route:create']">
          <Icon icon="ep:plus" class="mr-5px" />{{ t('fault.added') }}
        </el-button>
        <el-button
          type="success"
          plain
          :loading="exportLoading"
          @click="handleExport"
          v-hasPermi="['rq:iot-inspect-route:export']">
          <Icon icon="ep:download" class="mr-5px" />导出
        </el-button>
      </el-form-item>
    </el-form>

    <div
      class="table-panel bg-white dark:bg-[#1d1e1f] shadow rounded-lg flex flex-col p-4 min-w-0 min-h-0">
      <div class="flex-1 relative min-h-0">
        <el-auto-resizer class="absolute">
          <template #default="{ width, height }">
            <ZmTable
              :loading="loading"
              :data="list"
              :width="width"
              :height="height"
              :max-height="height"
              show-border
              settings-cache-key="pms-inspect-route-list">
              <ZmTableColumn
                type="index"
                :label="t('iotDevice.serial')"
                :width="70"
                fixed="left"
                hide-in-column-settings />
              <ZmTableColumn :label="t('route.RouteName')" prop="routeName" />
              <ZmTableColumn :label="t('monitor.category')" prop="deviceClassifyName" />
              <ZmTableColumn :label="t('monitor.deviceName')" prop="deviceName" />
              <ZmTableColumn :label="t('iotDevice.brand')" prop="brandName" />
              <ZmTableColumn
                :label="t('common.createTime')"
                prop="createTime"
                :formatter="dateFormatter" />
              <ZmTableColumn
                :label="t('operationFill.operation')"
                :width="120"
                action
                fixed="right">
                <template #default="scope">
                  <el-button
                    link
                    type="primary"
                    @click="openForm('update', scope.row.id)"
                    v-hasPermi="['rq:iot-inspect-route:update']">
                    {{ t('fault.edit') }}
                  </el-button>
                  <el-button
                    link
                    type="danger"
                    @click="handleDelete(scope.row.id)"
                    v-hasPermi="['rq:iot-inspect-route:delete']">
                    {{ t('fault.del') }}
                  </el-button>
                </template>
              </ZmTableColumn>
            </ZmTable>
          </template>
        </el-auto-resizer>
      </div>

      <div class="h-8 mt-2 flex items-center justify-end">
        <el-pagination
          v-show="total > 0"
          size="default"
          :current-page="queryParams.pageNo"
          :page-size="queryParams.pageSize"
          :background="true"
          :page-sizes="[10, 20, 30, 50, 100]"
          :total="total"
          layout="total, sizes, prev, pager, next, jumper"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange" />
      </div>
    </div>
  </div>

  <!-- 表单弹窗：添加/修改 -->
  <IotInspectRouteForm ref="formRef" @success="getList" />
</template>

<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { IotInspectRouteApi, IotInspectRouteVO } from '@/api/pms/inspect/route'
import IotInspectRouteForm from './IotInspectRouteForm.vue'
import { defaultProps } from '@/utils/tree'
import { useUserStore } from '@/store/modules/user'
const { push } = useRouter() // 路由跳转
/** 巡检路线 列表 */
defineOptions({ name: 'IotInspectRoute' })

import { useTableComponents } from '@/components/ZmTable/useTableComponents'
const { ZmTable, ZmTableColumn } = useTableComponents<IotInspectRouteVO>()

const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const rootDeptId = 156
const deptId = useUserStore().getUser.deptId || rootDeptId
const loading = ref(true) // 列表的加载中
const list = ref<IotInspectRouteVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const productClassifyList = ref<Tree[]>([]) // 树形结构
const queryParams = reactive({
  pageNo: 1,
  pageSize: 10,
  routeName: undefined,
  deviceClassify: undefined,
  deviceId: undefined,
  deviceClassifyName: undefined,
  deviceName: undefined,
  itemJson: undefined,
  remark: undefined,
  createTime: [],
  deptId: undefined
})
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中

const handleDeptNodeClick = async (row: Tree) => {
  queryParams.deptId = row.id
  queryParams.pageNo = 1
  await getList()
}
/** 查询列表 */
const getList = async () => {
  loading.value = true
  try {
    const data = await IotInspectRouteApi.getIotInspectRoutePage(queryParams)
    list.value = data.list
    total.value = data.total
  } finally {
    loading.value = false
  }
}

/** 搜索按钮操作 */
const handleQuery = () => {
  queryParams.pageNo = 1
  getList()
}

/** 重置按钮操作 */
const resetQuery = () => {
  queryFormRef.value?.resetFields()
  handleQuery()
}

const handleSizeChange = (pageSize: number) => {
  queryParams.pageSize = pageSize
  handleQuery()
}

const handleCurrentChange = (pageNo: number) => {
  queryParams.pageNo = pageNo
  getList()
}

/** 添加/修改操作 */
const openForm = (type: string, id?: number) => {
  //修改
  if (typeof id === 'number') {
    push({ name: 'RouteEdit', params: { id } })
    return
  }
  // 新增
  push({ name: 'RouteAdd', params: {} })
}

/** 删除按钮操作 */
const handleDelete = async (id: number) => {
  try {
    // 删除的二次确认
    await message.delConfirm()
    // 发起删除
    await IotInspectRouteApi.deleteIotInspectRoute(id)
    message.success(t('common.delSuccess'))
    // 刷新列表
    await getList()
  } catch {}
}

/** 导出按钮操作 */
const handleExport = async () => {
  try {
    // 导出的二次确认
    await message.exportConfirm()
    // 发起导出
    exportLoading.value = true
    const data = await IotInspectRouteApi.exportIotInspectRoute(queryParams)
    download.excel(data, '巡检路线.xls')
  } catch {
  } finally {
    exportLoading.value = false
  }
}

/** 初始化 **/
onMounted(() => {
  getList()
})
</script>

<style scoped>
.inspect-route-query {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px 24px;
}

.query-row {
  display: flex;
  flex: 1 1 auto;
  flex-wrap: wrap;
  align-items: center;
  min-width: 0;
  gap: 12px 24px;
}

.query-actions {
  flex: 0 0 auto;
}

.query-actions :deep(.el-form-item__content) {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 10px;
}

.query-actions :deep(.el-button) {
  margin-left: 0;
}

.query-control {
  width: 190px;
}

:deep(.el-form-item) {
  margin-bottom: 0;
}

:deep(.el-form-item__label) {
  white-space: nowrap;
}

@media (width >= 1800px) {
  .inspect-route-query,
  .query-row {
    flex-wrap: nowrap;
  }
}

@media (width <= 1500px) {
  .inspect-route-query,
  .query-row {
    gap: 12px 18px;
  }

  .query-control {
    width: 175px;
  }
}

@media (width <= 1200px) {
  .inspect-route-page {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: auto auto minmax(480px, 1fr);
    height: auto;
    min-height: calc(
      100vh - 20px - var(--top-tool-height) - var(--tags-view-height) - var(--app-footer-height)
    );
  }

  :deep(.inspect-route-tree) {
    grid-row: auto !important;
    width: 100% !important;
    height: 320px !important;
    min-width: 0 !important;
  }

  .query-actions {
    width: 100%;
  }
}

@media (width <= 768px) {
  .inspect-route-query,
  .table-panel {
    padding: 12px;
  }

  .query-row,
  .query-row :deep(.el-form-item),
  .query-actions,
  .query-control {
    width: 100%;
  }

  .query-actions :deep(.el-form-item__content) {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px;
    width: 100%;
  }

  .query-actions :deep(.el-button) {
    width: 100%;
  }
}
</style>
