<template>
  <!-- 搜索工作栏 -->
  <el-form inline :model="queryParams" class="-mb-15px" label-width="0">
    <el-form-item>
      <el-input
        v-model="queryParams.productName"
        class="!w-200px"
        clearable
        placeholder="请输入产品名称"
        @keyup.enter="handleQuery"
      />
    </el-form-item>
    <el-form-item>
      <el-select
        v-model="queryParams.productBrand"
        placeholder="请选择品牌"
        clearable
        filterable
        @change="handleQuery"
      >
        <el-option
          v-for="item in opts.brand"
          :key="item.brandId"
          :label="item.name"
          :value="item.brandId"
        />
      </el-select>
    </el-form-item>
    <el-form-item>
      <el-cascader
        :options="opts.productCategory"
        v-model="queryParams.productCategory"
        placeholder="请选择分类"
        clearable
        filterable
        :props="{ label: 'name', value: 'id', checkStrictly: true }"
        show-all-levels
        @change="handleQuery"
      />
    </el-form-item>
    <el-form-item>
      <el-button @click="handleQuery" v-hasPermi="['mall:prod:search']"> 搜索 </el-button>
      <el-button @click="resetQuery" v-hasPermi="['mall:prod:reset']"> 重置 </el-button>
      <el-button plain type="primary" @click="openForm(null)" v-hasPermi="['mall:prod:add']">
        新增
      </el-button>
    </el-form-item>
  </el-form>

  <!-- 列表 -->
  <el-table v-loading="loading" class="mt-20px" :data="tableList" border>
    <el-table-column type="expand" width="30">
      <template #default="{ row }">
        <div class="pl-100px pr-100px">
          <el-table :data="row.productSpecList">
            <el-table-column label="规格名称" prop="specsName" />
            <el-table-column />
            <el-table-column
              v-for="(item, index) in row.properties"
              :key="index"
              :label="item.label"
            >
              <template #default="scope">
                {{ scope.row.properties[index].valueName }}
              </template>
            </el-table-column>
            <el-table-column label="售价" prop="price" />
            <el-table-column label="简介" prop="intro" />
          </el-table>
        </div>
      </template>
    </el-table-column>
    <el-table-column key="productId" label="产品编码" prop="productId" />
    <el-table-column show-overflow-tooltip label="产品名称" min-width="200" prop="productName" />
    <el-table-column label="分类" min-width="90" prop="productCategoryName" />
    <el-table-column label="品牌" min-width="90" prop="productBrandName" />
    <el-table-column label="商品图" min-width="80">
      <template #default="{ row }">
        <el-image :src="row.mainImage" @click="imagePreview(row.mainImage)" class="w-30px h-30px" />
      </template>
    </el-table-column>
    <el-table-column label="简介" min-width="70" prop="productIntro" />
    <el-table-column :formatter="dateFormatter" label="创建时间" prop="createTime" width="180" />
    <el-table-column v-for="item in diyFieldList" :key="item.clueParamId" :label="item.label">
      <template #default="{ row }">
        <div v-if="item.component == 'DatePicker'">
          {{ formatDate(row[item.field]) }}
        </div>
        <div v-else>{{ row[item.field] }}</div>
      </template>
    </el-table-column>
    <el-table-column fixed="right" label="操作" min-width="100">
      <template #default="{ row }">
        <!-- TODO：【详情】，可以后面点做哈 -->
        <el-button
          link
          type="primary"
          @click="openForm(row.productId)"
          v-hasPermi="['mall:prod:update']"
        >
          修改
        </el-button>
        <el-button
          link
          type="danger"
          @click="handleDelete(row.productId)"
          v-hasPermi="['mall:prod:delete']"
        >
          删除
        </el-button>
      </template>
    </el-table-column>
  </el-table>
  <!-- 分页 -->
  <Pagination
    v-model:limit="queryParams.pageSize"
    v-model:page="queryParams.pageNo"
    :total="total"
    @pagination="getList"
  />
</template>

<script setup name="Product">
import { getDiyFieldList } from '@/api/mall/product/productField'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import { createImageViewer } from '@/components/ImageViewer'
import * as ProductApi from '@/api/mall/product'
import * as BrandApi from '@/api/mall/product/brand'
import * as CategoryApi from '@/api/mall/product/category'
import { handleTree } from '@/utils/tree'
import { isObject } from '@/utils/is.ts'

const { currentRoute, push } = useRouter()
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化

const queryParams = ref({
  productName: undefined,
  productBrand: undefined,
  productCategory: undefined,
  pageNo: 1,
  pageSize: 10
}) // 查询参数

const opts = ref({
  brand: [],
  productCategory: []
})

const loading = ref(false) // 列表的加载中
const total = ref(0) // 列表的总页数
const tableList = ref([]) // 列表的数据

/** 删除按钮操作 */
async function handleDelete(id) {
  try {
    // 删除的二次确认
    await message.delConfirm()
    // 发起删除
    await ProductApi.deleteProduct(id)
    message.success(t('common.delSuccess'))
    // 刷新列表
    await getList()
  } catch {}
}

async function getList() {
  loading.value = true
  try {
    const params = { ...queryParams.value }
    if (params.productCategory && params.productCategory.length) {
      params.productCategory = params.productCategory.at(-1)
    }
    const data = await ProductApi.getProductPage(params)
    tableList.value = data.list.map((prod) => {
      let diyField = {}
      if (prod.diyParams) {
        diyField = isObject(prod.diyParams) ? prod.diyParams : JSON.parse(prod.diyParams)
      }
      return {
        ...prod,
        ...diyField,
        properties: prod.productSpecList[0].properties.map((item) => ({
          propertyId: item.propertyId,
          label: item.propertyName
        }))
      }
    })
    total.value = data.total
  } finally {
    loading.value = false
  }
}
/** 商品图预览 */
function imagePreview(imgUrl) {
  createImageViewer({
    urlList: [imgUrl]
  })
}

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

const diyFieldList = ref([])

async function getOptions() {
  getDiyFieldList().then((data) => {
    diyFieldList.value = data
  })
  BrandApi.getSimpleBrandList().then((data) => {
    opts.value.brand = data || []
  })
  CategoryApi.getCategorySimpleList().then((data) => {
    opts.value.productCategory = handleTree(data || [])
  })
}

/** 重置按钮操作 */
function resetQuery() {
  queryParams.value = {
    productName: undefined,
    productBrand: undefined,
    productCategory: undefined,
    pageNo: 1,
    pageSize: 10
  }
  handleQuery()
}

/**
 * 新增或修改
 *
 * @param id 商品 编号
 */
function openForm(id) {
  // 修改
  if (id) {
    push({
      path: '/miniMall/productEdit',
      query: { id }
    })
    return
  }
  // 新增
  push('/miniMall/productAdd')
}

watch(
  () => currentRoute.value,
  () => {
    getList()
  }
)

handleQuery()

onMounted(() => {
  getOptions()
})
</script>

<style lang="scss" scoped>
.demo-table-expand {
  padding-left: 42px;

  :deep(.el-form-item__label) {
    width: 82px;
    font-weight: bold;
    color: #99a9bf;
  }
}
</style>
