import { appId } from "../../../env";
import { request } from "../../../utils/request";
import { receiveRedPacket } from "../../../utils/util";

const app = getApp<IAppOption>();

const pad = (n: number): string => String(n).padStart(2, "0");

const formatDate = (isoString: string): string => {
    const date = new Date(isoString);
    return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
};

const RED_STATE_MAP: Record<number, string> = {
    10: "未发送",
    11: "等待领取",
    20: "正在发送",
    21: "等待确认",
    30: "发送失败",
    31: "个数不够",
    32: "账户余额不足",
    33: "客户未实名",
    34: "其它原因",
    40: "已领取",
    50: "已过期",
};

const getStateText = (state: number): string => RED_STATE_MAP[state] || "发放中";

const FAILED_STATES = [30, 31, 32, 33, 34];

const canReceive = (state: number): boolean => state === 11 || state === 21 || FAILED_STATES.includes(state);

const isRetry = (state: number): boolean => FAILED_STATES.includes(state);

Page({
    data: {
        list: [] as any[],
        loading: false,
        hasMore: true,
        current: 1,
        pageSize: 15,
        activeTab: 0,
        tabs: [
            { label: '待领取', value: 0, type: 1 },
            { label: '已领取', value: 1, type: 2 },
            { label: '已过期', value: 2, type: 3 },
        ],
        summary: {
            totalAmount: '0.00',
            receivedAmount: '0.00',
            pendingAmount: '0.00',
            expiredAmount: '0.00',
        },
        safeBottom: app.globalData.safeBottom,
        safeTop: app.globalData.safeTop,
    },

    onLoad() {
        this.fetchRecords(1, false, this.data.tabs[0].type);
    },

    onReachBottom() {
        const { loading, hasMore, current, activeTab, tabs } = this.data;
        if (loading || !hasMore) return;
        this.fetchRecords(current + 1, true, tabs[activeTab].type);
    },

    onTabChange(e: any) {
        const index = e.detail.index;
        const tab = this.data.tabs[index];
        this.setData({ activeTab: index });
        this.fetchRecords(1, false, tab.type);
    },

    async handleReceive(e: any) {
        const { id } = e.currentTarget.dataset;
        const { code } = app.globalData.store || {};

        try {
            await receiveRedPacket(
                { appId, code, openId: wx.getStorageSync("openId"), redId: id },
                '/app/general/receive-red',
                appId
            );

            // 乐观更新：先立即更新本地数据，避免后端状态同步延迟导致展示不友好
            const { list, summary, activeTab, tabs } = this.data;
            const targetItem = list.find((item: any) => item.id === id);

            if (targetItem) {
                const amount = targetItem.amount || 0;
                const amountYuan = amount / 100;

                const updatedList = list.map((item: any) =>
                    item.id === id
                        ? { ...item, state: 40, stateText: getStateText(40), canReceive: false, isRetry: false }
                        : item
                );

                const updatedSummary = {
                    ...summary,
                    pendingAmount: Math.max(0, parseFloat(summary.pendingAmount) - amountYuan).toFixed(2),
                    receivedAmount: (parseFloat(summary.receivedAmount) + amountYuan).toFixed(2),
                };

                this.setData({ list: updatedList, summary: updatedSummary });
            }

            // 确保后端有足够时间同步，直接刷新
            setTimeout(() => {
                this.fetchRecords(1, false, tabs[activeTab].type);
            }, 3000);
        } catch (err) {
            console.error('领取红包失败:', err);
        }
    },

    async fetchRecords(page: number, append = false, type: number) {
        const openId = wx.getStorageSync("openId");
        if (!openId) {
            wx.showToast({ title: "请先登录", icon: "none" });
            return;
        }

        if (append) {
            this.setData({ loading: true });
        }

        try {
            const { state, seeId, code } = app.globalData.store || {};
            const params: Record<string, any> = {
                openId,
                current: page,
                pageSize: this.data.pageSize,
                type,
            };
            if (code) params.code = code;
            if (state) params.state = state;
            if (seeId) params.seeId = seeId;

            const res: any = await request({
                options: {
                    url: "/app/video-watch/record",
                    data: params,
                },
                isLoading: !append,
            });

            const records = res.data?.records || res.records || [];
            const items = records.map((item: any) => ({
                ...item,
                date: formatDate(item.createdTime),
                stateText: getStateText(item.state),
                amountText: (item.amount / 100).toFixed(2),
                canReceive: canReceive(item.state),
                isRetry: isRetry(item.state),
            }));

            this.setData({
                list: append ? [...this.data.list, ...items] : items,
                current: page,
                hasMore: records.length >= this.data.pageSize,
            });

            const d = res.data;
            if (d && d.totalAmount !== undefined) {
                this.setData({
                    summary: {
                        totalAmount: (d.totalAmount / 100).toFixed(2),
                        receivedAmount: (d.receivedAmount / 100).toFixed(2),
                        pendingAmount: (d.pendingAmount / 100).toFixed(2),
                        expiredAmount: (d.expiredAmount / 100).toFixed(2),
                    },
                });
            }
        } catch (err) {
            console.error("加载红包记录失败:", err);
        } finally {
            if (append) {
                this.setData({ loading: false });
            }
        }
    },
});
