// src\utils\querySFExpress.ts
import { getAccessToken } from './getAccessToken'; // 确保路径正确

/**
 * 查询顺丰物流信息
 * @param trackingNumber 物流单号
 * @param phoneLast4Digits 手机尾号（后4位）
 * @returns 物流查询结果
 */
export async function querySFExpress(trackingNumber: string, phoneLast4Digits: string) {
    try {
        const accessToken = await getAccessToken();
        const partnerID = process.env.PARTNER_ID || 'YPD607MO';
        const reqUrl = 'https://bspgw.sf-express.com/std/service';
        const requestID = crypto.randomUUID();
        const serviceCode = "EXP_RECE_SEARCH_ROUTES";
        const timestamp = Date.now().toString();
        
        // 确保参数有效
        if (!trackingNumber) {
            throw new Error('物流单号不能为空');
        }
        
        if (!phoneLast4Digits) {
            throw new Error('手机尾号不能为空');
        }
        
        const msgData = {
            language: "zh-CN",
            trackingType: "1",
            trackingNumber: [trackingNumber],
            methodType: "1",
            checkPhoneNo: phoneLast4Digits
        };

        const formData = new URLSearchParams();
        formData.append('partnerID', partnerID);
        formData.append('requestID', requestID);
        formData.append('serviceCode', serviceCode);
        formData.append('timestamp', timestamp);
        formData.append('accessToken', accessToken);
        formData.append('msgData', JSON.stringify(msgData));

        console.log(`查询物流: ${trackingNumber}, 手机尾号: ${phoneLast4Digits}`);
        
        const response = await fetch(reqUrl, {
            method: 'POST',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: formData.toString()
        });

        if (!response.ok) {
            throw new Error(`请求失败: ${response.status} - ${response.statusText}`);
        }

        const result = await response.json();
        
        // 记录完整响应以便调试
        console.log(`顺丰API完整响应: ${JSON.stringify(result, null, 2)}`);
        
        // 特殊处理A1000错误码，因为可能包含有效数据
        if (result.apiResultCode === 'A1000') {
            console.warn(`顺丰API返回A1000码，尝试解析响应数据`);
            
            try {
                // 尝试解析apiResultData
                if (result.apiResultData && typeof result.apiResultData === 'string') {
                    const parsedData = JSON.parse(result.apiResultData);
                    
                    // 检查内部success标志
                    if (parsedData.success === true) {
                        console.log(`顺丰API内部success为true，使用内部数据`);
                        
                        // 修复返回格式，使用内部数据替换外部错误信息
                        return {
                            apiResultCode: parsedData.errorCode || 'S0000',
                            apiErrorMsg: parsedData.errorMsg || '',
                            apiResultData: parsedData,
                            _originalResponse: result
                        };
                    }
                }
            } catch (parseError) {
                console.error(`解析顺丰API数据失败:`, parseError);
            }
        }
        
        // 检查API返回的状态码
        if (result.apiResultCode !== '0000') {
            const errorMsg = result.apiErrorMsg || '未知错误';
            console.error(`顺丰API错误: ${result.apiResultCode} - ${errorMsg}`);
            console.error(`顺丰API请求详情: 单号=${trackingNumber}, 手机尾号=${phoneLast4Digits}`);
            console.error(`顺丰API完整响应: ${JSON.stringify(result, null, 2)}`);
            throw new Error(`API错误: ${errorMsg} (错误码: ${result.apiResultCode})`);
        }
        
        return result;
    } catch (error) {
        console.error('查询顺丰快递时出错:', error);
        
        // 记录详细的错误上下文信息
        console.error(`查询参数: 单号=${trackingNumber}, 手机尾号=${phoneLast4Digits}`);
        
        if (error instanceof Error) {
            console.error(`错误堆栈: ${error.stack}`);
        }
        
        // 格式化错误响应，方便上层处理
        return {
            apiResultCode: 'ERROR',
            apiErrorMsg: error instanceof Error ? error.message : '未知错误',
            apiResultData: null,
            error: error // 添加原始错误对象
        };
    }
}
