<template>
  <el-card style="margin-bottom: 0.5vh;">
    <el-col style="margin-bottom: 1vh">
      <div class="select">
        <div class="selectRow">
          <el-text class="text" size="large">精网号：</el-text>
          <el-input class="selectContent" v-model="rechargeAudit.jwcode" placeholder="请输入精网号" clearable />
        </div>
        <div class="selectRow">
          <el-text class="text" size="large">活动名称：</el-text>
          <el-select class="selectContent" v-model="rechargeAudit.activity" placeholder="请选择活动名称" clearable>
            <el-option v-for="item in activity" :key="item" :label="item" :value="item" />
          </el-select>
        </div>
        <div class="selectRow">
          <el-text class="text" size="large">支付方式：</el-text>
          <el-select class="selectContent" v-model="rechargeAudit.payModel" placeholder="请选择支付方式" clearable>
            <el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value" />
          </el-select>
        </div>
        <div class="selectRow">
          <el-text class="text" size="large">所属地区：</el-text>
          <el-cascader class="selectContent" v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区"
            clearable @change="handleMarketChange" />
        </div>
      </div>
    </el-col>
    <el-col>
      <div class="select">
        <div class="selectRow" style="width: 36vw;">
          <el-text class="text" size="large">
            {{ activeName === 'wait' ? '提交时间：' : '审核时间：' }}
          </el-text>
          <el-date-picker class="selectContent" v-model="getTime" type="datetimerange" range-separator="至"
            start-placeholder="起始时间" end-placeholder="结束时间" style="margin-right:1vw;width:25vw"
            @change="handleDatePickerChange" :default-time="defaultTime" :disabled-date="disabledDate" />
          <div v-if="false">
            <el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''">今</el-button>
            <el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''">昨</el-button>
            <el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
          </div>
        </div>
        <div class="selectRow" style="justify-content: flex-start;">
          <el-button @click="resetSearch" type="success">重置</el-button>
        <el-button @click="handleSearch" type="primary">查询</el-button>
        </div>
      </div>
    </el-col>
  </el-card>
  <el-card>
    <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
      <el-tab-pane label="待审核" name="wait"></el-tab-pane>
      <el-tab-pane label="已通过" name="pass"></el-tab-pane>
      <el-tab-pane label="已驳回" name="reject"></el-tab-pane>
      <div>

        <!--        总条数：{{ format3(stats.totalNum) }}条&nbsp;&nbsp;&nbsp;&nbsp;-->
        充值新币：{{ format3(stats.permanentGolds) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
        总金币数：{{ format3((stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2))
        }}金币&nbsp;&nbsp;&nbsp;&nbsp;
        永久金币：{{ format3(stats.permanentGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
        免费金币：{{ format3(stats.freeGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
      </div>
    </el-tabs>
    <el-table :data="tableData" style="width: 82vw;height:54vh" @sort-change="handleSortChange"
      :row-style="{ height: '50px' }">
      <el-table-column type="index" label="序号" width="100px" fixed="left">
        <template #default="scope">
          <span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
        </template>
      </el-table-column>
      <el-table-column fixed="left" prop="name" label="姓名" width="150px" show-overflow-tooltip />
      <el-table-column fixed="left" prop="jwcode" label="精网号" width="110px" />
      <el-table-column prop="market" label="所属地区" width="100px" />
      <el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip />
      <el-table-column prop="rateName" label="货币名称" width="110px" />
      <el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
        <template #default="scope">{{ scope.row.money / 100 }}</template>
      </el-table-column>
      <el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom">
        <template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
      </el-table-column>
      <el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
        <template #default="scope">{{ (scope.row.freeGold) / 100 }}</template>
      </el-table-column>
      <el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
      <el-table-column prop="payModel" label="支付方式" width="110px" />
      <el-table-column prop="voucher" label="支付凭证" width="110px">
        <template #default="scope">
          <div v-if="scope.row.voucher"
            style="display: flex; justify-content: center; align-items: center; cursor: pointer;"
            @click="previewImage(scope.row.voucher)">
            <img :src="scope.row.voucher" alt="支付凭证" style="width: auto; height: 40px;">
          </div>
          <div v-else style="display: flex; justify-content: center; align-items: center; height: 40px;">--</div>
        </template>
      </el-table-column>
      <el-table-column prop="adminName" label="提交人" width="100px" />
      <el-table-column prop="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px"
        show-overflow-tooltip />
      <el-table-column v-if="activeName !== 'wait'" prop="auditName" label="审核人" width="100px" />
      <el-table-column prop="payTime" sortable="custom" label="交款时间" width="200px">
        <template #default="scope">
          {{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
        </template>
      </el-table-column>
      <el-table-column prop="createTime" sortable="custom" label="提交时间" width="200px">
        <template #default="scope">
          <!--          {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}-->
          {{
            activeName === 'wait'
              ? moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss')
              : moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss')
          }}
        </template>
      </el-table-column>
      <el-table-column v-if="activeName !== 'wait'" prop="auditTime" label="审核时间" width="200px">
        <template #default="scope">
          {{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }}
        </template>
      </el-table-column>
      <el-table-column v-if="activeName === 'wait'" fixed="right" prop="operation" label="操作" width="150px">
        <template #default="scope">
          <div class="operation">
            <el-popconfirm title="确定要通过此条记录吗？" @confirm="handleApprove(scope.row)">
              <template #reference>
                <el-button :disabled="clicked || cancelClicked" type="primary" text>
                  通过
                </el-button>
              </template>
              <template #actions="{ confirm, cancel }">
                <el-button size="small" @click="cancel">取消</el-button>
                <el-button type="primary" size="small" :disabled="clicked" @click="confirm">
                  确认
                </el-button>
              </template>
            </el-popconfirm>
            <el-button :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
              驳回
            </el-button>
          </div>
        </template>
      </el-table-column>
    </el-table>
    <div class="pagination">
      <el-pagination :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
        layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePagination('size', $event)"
        @current-change="handlePagination('page', $event)"></el-pagination>
    </div>
  </el-card>

  <el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
    <el-form>
      <el-form-item label="驳回理由" required>
        <el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
          show-word-limit />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="rejectDialogVisible = false">取消</el-button>
        <el-button :disabled="cancelClicked" type="primary" @click="handleReject">确定</el-button>
      </span>
    </template>
  </el-dialog>
</template>

<script setup>
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import request from '@/util/http.js'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";

const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs";

const defaultTime = [
  new Date(2000, 1, 1, 0, 0, 0),
  new Date(2000, 2, 1, 23, 59, 59),
]
//无法选择的时间
const disabledDate = (time) => {
  const limitDate = new Date(2025, 0, 1);
  return time.getTime() < limitDate.getTime();
}
const tableData = ref([])
// 当前激活的时间按钮
const activeTimeRange = ref('')
const total = ref(50)
// 搜索对象时间
const getTime = ref([])
const activity = ref([])
const market = ref("")
const rejectDialogVisible = ref(false)
const rejectReason = ref('')
// 当前行信息
const currentRecord = ref(null)
// 标签页默认是待审批
const activeName = ref('wait')
const sortField = ref('')
const sortOrder = ref('')
// 存储地区选择变化
const selectedMarketPath = ref("")
// 搜索表单
const rechargeAudit = ref({
  jwcode: "", // 精网号
  activity: "", // 活动名称
  payModel: "", // 支付方式
  startTime: "", // 充值时间开始
  endTime: "", // 充值时间结束
  market: "", // 地区
  auditStatus: "0",
})
// 搜索对象
const getObj = ref({
  pageNum: 1,
  pageSize: 50
})
// 支付方式选项
const payModel = [
  {
    value: '银行转账',
    label: '银行转账'
  },
  {
    value: '现金',
    label: '现金'
  },
  {
    value: '支票',
    label: '支票'
  },
  {
    value: '刷卡',
    label: '刷卡'
  },
  {
    value: 'Grabpay',
    label: 'Grabpay'
  },
  {
    value: 'Nets',
    label: 'Nets'
  },
  {
    value: 'PayPal',
    label: 'PayPal'
  },
  {
    value: 'Stripe-链接收款',
    label: 'Stripe-链接收款'
  },
  {
    value: 'Ipay88-链接收款',
    label: 'Ipay88-链接收款'
  },
  {
    value: 'PaymentAsia-链接收款',
    label: 'PaymentAsia-链接收款'
  },
  {
    value: '其他',
    label: '其他'
  }
]
// 统计合计数
const stats = ref({
  totalNum: 0,
  totalCoins: 0,
  permanentGolds: 0,
  freeGolds: 0,
  taskGolds: 0
})
// 表单验证
const rules = reactive({
  rejectReason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
})
// 搜索方法
const getRecharge = async function (val) {
  try {
    if (getTime.value && getTime.value.length === 2) {
      rechargeAudit.value.startTime = formatTime(getTime.value[0])
      rechargeAudit.value.endTime = formatTime(getTime.value[1])
    } else {
      rechargeAudit.value.startTime = ''
      rechargeAudit.value.endTime = ''
    }
    // if (rechargeAudit.value.market === '总部' || rechargeAudit.value.market === '研发部') {
    //   rechargeAudit.value.market = '';
    // }
    // 校验精网号（数字格式）
    if (rechargeAudit.value.jwcode) {
      // 纯数字
      const numberRegex = /^\d{1,9}$/;
      // 检查是否不是数字
      if (!numberRegex.test(rechargeAudit.value.jwcode)) {
        ElMessage.error('请检查精网号格式')
        return
      }
    }
    const result = await request({
      url: '/audit/selectRecharge',
      data: {
        pageNum: getObj.value.pageNum,
        pageSize: getObj.value.pageSize,
        rechargeAudit: {
          ...rechargeAudit.value,
          sortField: sortField.value,
          sortOrder: sortOrder.value
        }
      }
    })
    tableData.value = result.list
    total.value = result.total
  } catch (error) {
    console.log('请求失败', error)
  }
}

const getStats = async () => {
  try {
    const params = {
      pageNum: getObj.value.pageNum,
      pageSize: getObj.value.pageSize,
      rechargeAudit: rechargeAudit.value
    }
    // 校验精网号（数字格式）
    if (rechargeAudit.value.jwcode) {
      // 纯数字
      const numberRegex = /^\d{1,9}$/;
      // 检查是否不是数字
      if (!numberRegex.test(rechargeAudit.value.jwcode)) {
        // ElMessage.error('精网号必须为数字格式')
        // 上面提示过了
        return
      }
    }
    const res = await API({
      url: '/audit/sumRechargeGold',
      data: params
    })

    stats.value.totalNum = res.totalNum
    stats.value.permanentGolds = res.permanentGolds / 100
    stats.value.freeGolds = res.freeGolds / 100
    stats.value.taskGolds = res.taskGolds / 100
    console.log('see see stats和搜索对象', stats.value, params)
  } catch (error) {
    console.log('请求失败', error)
  }
}
// 搜索
const handleSearch = function () {
  trimJwCode();
  getObj.value.pageNum = 1
  getRecharge()
  getStats()
}

// 重置
const resetSearch = function () {
  rechargeAudit.value = {
    jwcode: "",
    activity: "",
    payModel: "",
    startTime: "",
    endTime: "",
    market: "",
    auditStatus: rechargeAudit.value.auditStatus
  }
  selectedMarketPath.value = []
  getTime.value = []
  activeTimeRange.value = '' // 清除激活状态
  getRecharge()
  getStats()
}

// 今天
const getToday = function () {
  const today = dayjs()
  const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
  const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  getTime.value = [startTime, endTime]
  console.log('getTime', getTime.value)
  activeTimeRange.value = 'today' // 标记当前激活状态
  getRecharge()
  getStats()
}

// 昨天
const getYesterday = function () {
  const today = dayjs()
  const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  getTime.value = [startTime, endTime]
  console.log('getTime', getTime.value)
  activeTimeRange.value = 'yesterday' // 标记当前激活状态
  getRecharge()
  getStats()
}

// 近7天
const get7Days = function () {
  const today = dayjs()
  const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  getTime.value = [startTime, endTime]
  console.log('getTime', getTime.value)
  activeTimeRange.value = '7days' // 标记当前激活状态
  getRecharge()
  getStats()
}

// 待审核充值明细
const adminWait = async function () {
  rechargeAudit.value.auditStatus = "0"
  getObj.value.pageNum = 1
  await getRecharge()
  await getStats()
  console.log('adminWait，这是点击待审核调用')
}

// 已通过充值明细
const adminPass = async function () {
  rechargeAudit.value.auditStatus = "1"
  getObj.value.pageNum = 1
  await getRecharge()
  await getStats()
  console.log('adminWait，这是点击已通过调用')
}

// 已驳回充值明细
const adminReject = async function () {
  rechargeAudit.value.auditStatus = "2"
  getObj.value.pageNum = 1
  await getRecharge()
  await getStats()
  console.log('adminWait，这是点击已驳回调用')
}

const handleClick = function (tab, event) {
  activeName.value = tab.props.name
  if (tab.props.name === 'wait') {
    adminWait()
  } else if (tab.props.name === 'pass') {
    adminPass()
  } else if (tab.props.name === 'reject') {
    adminReject()
  }
}
const getActivity = async function () {
  try {
    const result = await request({
      url: '/general/activity',
      data: {}
    })
    activity.value = result.data
    console.log('activity', activity.value)
  } catch (error) {
    console.log('请求失败', error)
  }
}
const handlePagination = (type, val) => {
  if (type === 'size') {
    getObj.value.pageSize = val
  } else {
    getObj.value.pageNum = val
  }
  getRecharge()
  getStats()
}
const clicked = ref(false);
// 处理通过操作
const handleApprove = async (row) => {
  clicked.value = true
  if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
    try {
      const params = {
        orderCode: row.orderCode,
        auditId: adminData.value.id,
        action: 1,
        rejectReason: ''
      }
      await request({ url: '/audit/audit', data: params })
      ElMessage.success('审核通过成功')
      await getRecharge()
      clicked.value = false
      await getStats()
    } catch (error) {
      console.error('审核通过失败', error)
      ElMessage.error('操作失败')
    }
  } else {
    clicked.value = false
    ElMessage.error('无权限')
  }

}
const showRejectDialog = (row) => {
  currentRecord.value = row
  rejectReason.value = ''
  if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
    rejectDialogVisible.value = true
  } else {
    ElMessage.error('无权限')
  }
}
//控制驳回确认按钮禁用状态
const cancelClicked = ref(false)
// 处理驳回操作
const handleReject = async () => {
  cancelClicked.value = true
  if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {

    if (!rejectReason.value.trim()) {
      ElMessage.warning('请输入驳回理由')
      return
    }
    try {
      const params = {
        orderCode: currentRecord.value.orderCode,
        auditId: adminData.value.id,
        action: 2,
        rejectReason: rejectReason.value
      }

      await request({ url: '/audit/audit', data: params })
      ElMessage.success('驳回操作成功')
      rejectDialogVisible.value = false
      await getRecharge()
      cancelClicked.value = false
      await getStats()
    } catch (error) {
      console.error('驳回操作失败', error)
      ElMessage.error('操作失败')
    }
  } else {
    ElMessage.error('无权限')
    cancelClicked.value = false
  }
}
// 处理排序事件
const handleSortChange = (column) => {
  console.log('排序字段：', column.prop)
  console.log('排序方式：', column.order)

  if (column.prop === 'money') {
    sortField.value = 'permanent_gold'
  } else if (column.prop === 'permanentGold') {
    sortField.value = 'permanent_gold'
  } else if (column.prop === 'freeGold') {
    sortField.value = 'freeGold'
  } else if (column.prop === 'createTime') {
    sortField.value = 'create_time'
  } else if (column.prop === 'payTime') {
    sortField.value = 'pay_time'
  } else if (column.prop === 'auditTime') {
    sortField.value = 'audit_time'
  }
  sortOrder.value = column.order === 'ascending' ? 'asc' : 'desc'
  getRecharge()
  getStats()
}
// 预览图片函数
const previewImage = (imageUrl) => {
  // 使用 element-plus 的 el-image 组件实现图片预览功能
  const imageElement = document.createElement('img');
  imageElement.src = imageUrl;
  imageElement.style.maxWidth = '80vw';
  imageElement.style.maxHeight = '80vh';

  const viewer = document.createElement('div');
  viewer.style.position = 'fixed';
  viewer.style.top = '0';
  viewer.style.left = '0';
  viewer.style.width = '100vw';
  viewer.style.height = '100vh';
  viewer.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  viewer.style.display = 'flex';
  viewer.style.justifyContent = 'center';
  viewer.style.alignItems = 'center';
  viewer.style.zIndex = '9999';
  viewer.style.overflow = 'auto';

  viewer.appendChild(imageElement);
  document.body.appendChild(viewer);

  viewer.addEventListener('click', () => {
    document.body.removeChild(viewer);
  });
};
const handleMarketChange = (value) => {
  if (value && value.length > 0) {
    rechargeAudit.value.market = value[value.length - 1]
  } else {
    rechargeAudit.value.market = ''
  }
}

const props = { multiple: true }
// 获取地区，修改为级联下拉框
const getMarket = async function () {
  try {
    const result = await API({
      url: '/market/selectMarket',
    });
    console.log('请求成功', result)
    // 递归转换树形结构为级联选择器需要的格式（跳过第一级节点）
    const transformTree = (nodes) => {
      // 直接处理第一级节点的子节点
      const allChildren = nodes.flatMap(node => node.children || []);
      return allChildren.map(child => {
        const grandchildren = child.children && child.children.length
          ? transformTree([child]) // 递归处理子节点
          : null;
        return {
          value: child.name,
          label: child.name,
          children: grandchildren
        };
      });
    };
    market.value = transformTree(result.data)
    console.log('转换后的地区树==============', market.value)
  } catch (error) {
    console.log('请求失败', error)
  }
}
// 每三位添加逗号
const format3 = (num) => {
  return num.toLocaleString('en-US')
}
// 日期选择器变化时清除按钮激活状态
const handleDatePickerChange = () => {
  activeTimeRange.value = ''
}
// 精网号去空格
const trimJwCode = () => {
  if (rechargeAudit.value.jwcode) {
    rechargeAudit.value.jwcode = rechargeAudit.value.jwcode.replace(/\s/g, '');
  }
}
const cancelClick = () => {

}

const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
// 挂载
onMounted(async function () {
  await getActivity()
  await getMarket()
  await getRecharge()
  console.log("看看通信来的用户身份", adminData.value)
  await getStats()
})
</script>

<style scoped>
.pagination {
  display: flex;
  margin-top: 0.5vh;
}

.operation {
  display: flex;
}

.select {
  display: flex;

  .selectRow {
    width: 17vw;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0 0.5vw;

    .text {
      width: 5vw;
      font-size: 15px;
    }

    .selectContent {
      flex: 1;
    }
  }
}
</style>