import { postgrestGet, type PostgrestParams } from "../postgrest-client";
import dayjs from 'dayjs';

/**
 * 从不同格式的 API 响应中提取数据
 * @param responseData API 响应数据
 * @returns 提取后的数据或 null
 */
function extractApiData<T>(responseData: unknown): T | null {
    if (!responseData) {
        console.warn('API响应数据为空');
        return null;
    }

    try {
        // 检查是否有错误信息
        if (typeof responseData === 'object' && responseData !== null) {
            // 错误检查: 检查错误码，一般成功的错误码是0或200
            if ('code' in responseData) {
                const code = (responseData as { code: number }).code;
                // 如果有错误码且不是成功状态
                if (code !== 0 && code !== 200) {
                    const errorMsg = 'msg' in responseData 
                        ? (responseData as { msg: string }).msg 
                        : '未知错误';
                    console.error(`API响应错误: [${code}] ${errorMsg}`);
                    return null;
                }
            }

            // 错误检查: 检查是否包含错误消息但没有数据
            if ('error' in responseData && (responseData as { error: unknown }).error) {
                const error = (responseData as { error: unknown }).error;
                console.error(`API响应包含错误: ${typeof error === 'string' ? error : JSON.stringify(error)}`);
                return null;
            }

            // 格式1: { code: number, msg: string, data: T }
            if ('data' in responseData) {
                const data = (responseData as { data: unknown }).data;
                if (!data) {
                    console.warn('API响应中的data字段为空');
                    return null;
                }
                return data as T;
            }
        }

        // 格式2: 直接是数据对象
        return responseData as T;
    } catch (error) {
        console.error('处理API响应数据时出错:', error);
        return null;
    }
}

/**
 * 首页数据统计响应类型
 */
interface HomeStatistics {
  todayPendingFiles: number;
  monthlyReviewedFiles: number;
  monthlyReviewGrowth: {
    value: number;
    isUp: boolean;
  };
  monthlyPassRate: number;
  passRateGrowth: {
    value: number;
    isUp: boolean;
  };
  issuesDetected: number;
  issuesGrowth: {
    value: number;
    isUp: boolean;
  };
}

/**
 * 获取主页数据
 * @returns 主页数据
 */
export async function getHomeData(): Promise<HomeStatistics> {
    try {
        // 获取当前日期和时间相关值
        const startOfToday = dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss');
        const startOfThisMonth = dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss');
        const endOfThisMonth = dayjs().endOf('month').format('YYYY-MM-DD HH:mm:ss');
        const startOfLastMonth = dayjs().subtract(1, 'month').startOf('month').format('YYYY-MM-DD HH:mm:ss');
        const endOfLastMonth = dayjs().subtract(1, 'month').endOf('month').format('YYYY-MM-DD HH:mm:ss');

        // 通用API响应处理函数
        const handleApiResponse = async <T>(
            apiCall: Promise<{ 
                data?: unknown; 
                headers?: Record<string, string>;
                error?: string; 
                status?: number 
            }>, 
            errorMessage: string, 
            defaultValue: T
        ): Promise<T> => {
            try {
                const response = await apiCall;
                if (response.error) {
                    console.error(`${errorMessage}: ${response.error}`);
                    return defaultValue;
                }
                const data = extractApiData<T>(response.data);
                if (!data) {
                    console.warn(`${errorMessage}: 无法提取有效数据`);
                    return defaultValue;
                }
                return data;
            } catch (error) {
                console.error(`${errorMessage}: ${error instanceof Error ? error.message : '未知错误'}`);
                return defaultValue;
            }
        };

        // 1. 今日待审核文件 - 获取今天的待审核文件数量 (audit_status = 0 或 2)
        const todayPendingParams: PostgrestParams = {
            select: 'count',
            filter: {
                or: `(audit_status.eq.0,audit_status.eq.2,audit_status.is.null)`,
                created_at: `gte.${startOfToday}`,
                is_test_document: `eq.false`
            }
        };
        const todayPendingCount = await handleApiResponse<{count: number}[]>(
            postgrestGet('documents', todayPendingParams),
            '获取今日待审核文件数量失败',
            []
        );
        const todayPendingFiles = todayPendingCount[0]?.count || 0;

        // 2. 本月已审核文件 - 获取本月已审核文件数量 (audit_status != 0 且 != 2)
        const thisMonthReviewedParams: PostgrestParams = {
            select: 'count',
            filter: {
                and: `(audit_status.neq.0,audit_status.neq.2)`,
                updated_at: `gte.${startOfThisMonth}`,
                is_test_document: `eq.false`
            }
        };
        const thisMonthReviewedCount = await handleApiResponse<{count: number}[]>(
            postgrestGet('documents', thisMonthReviewedParams),
            '获取本月已审核文件数量失败',
            []
        );
        // 本月已审核文件数量
        const monthlyReviewedFiles = thisMonthReviewedCount[0]?.count || 0;

        // 上月已审核文件
        const lastMonthReviewedParams: PostgrestParams = {
            select: 'count',
            filter: {
                or: `(audit_status.eq.1,audit_status.eq.-1)`,
                and: `(updated_at.gte.${startOfLastMonth},updated_at.lte.${endOfLastMonth})`,
                is_test_document: `eq.false`
            }
        };
        const lastMonthReviewedCount = await handleApiResponse<{count: number}[]>(
            postgrestGet('documents', lastMonthReviewedParams),
            '获取上月已审核文件数量失败',
            []
        );
        // 上月已审核文件数量
        const lastMonthReviewed = lastMonthReviewedCount[0]?.count || 0;

        // 计算同比增长
        let reviewGrowthValue = 0;
        let reviewGrowthIsUp = true;
        // console.log('lastMonthReviewed-------', lastMonthReviewed);
        // console.log('monthlyReviewedFiles-------', monthlyReviewedFiles);
        if (lastMonthReviewed > 0) {
            const growthRate = ((monthlyReviewedFiles - lastMonthReviewed) / lastMonthReviewed) * 100;
            reviewGrowthValue = Math.abs(parseFloat(growthRate.toFixed(1)));
            reviewGrowthIsUp = growthRate >= 0;
        }

        // 3. 审核通过率 - 本月审核通过率 
        const thisMonthTotalParams: PostgrestParams = {
            select: 'count',
            filter: {
                audit_status: `eq.1`,
                created_at: `gte.${startOfThisMonth}`,
                is_test_document: `eq.false`
            }
        };
        const thisMonthTotalCount = await handleApiResponse<{count: number}[]>(
            postgrestGet('documents', thisMonthTotalParams),
            '获取本月审核通过数量失败',
            []
        );
        // 本月审核通过数量
        const thisMonthPassTotal = thisMonthTotalCount[0]?.count || 0;

        // 本月审核通过率
        const monthlyPassRate = (thisMonthPassTotal > 0 && monthlyReviewedFiles > 0)
            ? parseFloat(((thisMonthPassTotal / monthlyReviewedFiles) * 100).toFixed(1)) 
            : 0;

        // 上月审核通过率
        const lastMonthTotalParams: PostgrestParams = {
            select: 'count',
            filter: {
                audit_status: `eq.1`,
                and: `(updated_at.gte.${startOfLastMonth},updated_at.lte.${endOfLastMonth})`,
                is_test_document: `eq.false`
            }
        };
        const lastMonthTotalCount = await handleApiResponse<{count: number}[]>(
            postgrestGet('documents', lastMonthTotalParams),
            '获取上月审核通过数量失败',
            []
        );
        // 上月审核通过数量
        const lastMonthTotal = lastMonthTotalCount[0]?.count || 0;

        // 上月审核通过率
        const lastMonthPassRate = (lastMonthTotal > 0 && lastMonthReviewed > 0)
            ? parseFloat(((lastMonthTotal / lastMonthReviewed) * 100).toFixed(1))
            : 0;

        // 计算通过率同比增长
        let passRateGrowthValue = 0;
        let passRateGrowthIsUp = true;
        
        if (lastMonthPassRate > 0) {
            const passRateGrowth = ((monthlyPassRate - lastMonthPassRate) / lastMonthPassRate) * 100;
            passRateGrowthValue = Math.abs(parseFloat(passRateGrowth.toFixed(1)));
            passRateGrowthIsUp = passRateGrowth >= 0;
        }

        // 4. 检查出的问题总数（从评估结果表中统计）
        const thisMonthIssuesParams: PostgrestParams = {
            select: 'count',
            filter: {
                and: `(created_at.gte.${startOfThisMonth},created_at.lte.${endOfThisMonth})`,
                'evaluated_results->result': 'eq.false'  // 使用->操作符访问JSONB字段
            }
        };
        const thisMonthIssuesResponse = await handleApiResponse<{count: number}[]>(
            postgrestGet('evaluation_results', thisMonthIssuesParams),
            '获取本月问题数据失败',
            []
        );
        // 本月问题数量
        const thisMonthIssuesCount = thisMonthIssuesResponse[0]?.count || 0;

        // 上月问题数量
        const lastMonthIssuesParams: PostgrestParams = {
            select: 'count',
            filter: {
                and: `(created_at.gte.${startOfLastMonth},created_at.lte.${endOfLastMonth})`,
                'evaluated_results->result': 'eq.false'  // 使用->操作符访问JSONB字段
            }
        };
        const lastMonthIssuesResponse = await handleApiResponse<{count: number}[]>(
            postgrestGet('evaluation_results', lastMonthIssuesParams),
            '获取上月问题数据失败',
            []
        );
        // 上月问题数量
        const lastMonthIssuesCount = lastMonthIssuesResponse[0]?.count || 0;

        // 计算问题数量同比增长
        let issuesGrowthValue = 0;
        let issuesGrowthIsUp = true;
        
        if (lastMonthIssuesCount > 0) {
            const issuesGrowth = ((thisMonthIssuesCount - lastMonthIssuesCount) / lastMonthIssuesCount) * 100;
            issuesGrowthValue = Math.abs(parseFloat(issuesGrowth.toFixed(1)));
            issuesGrowthIsUp = issuesGrowth >= 0;
        }

        // 返回统计结果
        return {
            todayPendingFiles,
            monthlyReviewedFiles,
            monthlyReviewGrowth: {
                value: reviewGrowthValue,
                isUp: reviewGrowthIsUp
            },
            monthlyPassRate,
            passRateGrowth: {
                value: passRateGrowthValue,
                isUp: passRateGrowthIsUp
            },
            issuesDetected: thisMonthIssuesCount,
            issuesGrowth: {
                value: issuesGrowthValue,
                isUp: issuesGrowthIsUp
            }
        };
    } catch (error) {
        console.error('获取首页数据失败:', error instanceof Error ? error.message : String(error));
        // 返回默认值以防止页面崩溃
        return {
            todayPendingFiles: 0,
            monthlyReviewedFiles: 0,
            monthlyReviewGrowth: { value: 0, isUp: true },
            monthlyPassRate: 0,
            passRateGrowth: { value: 0, isUp: true },
            issuesDetected: 0,
            issuesGrowth: { value: 0, isUp: true }
        };
    }
}

