import { request } from '@umijs/max';
import type {
    SysUserMessage,
    ChatContact,
    ChatContactListParams,
    ChatHistoryParams,
    SendMessageParams,
} from './data.d';

// API 路径配置 - 可根据实际后端接口调整
const API_CONFIG = {
    CHAT_CONTACTS: '/api/system/message/contacts',  // 可改为: '/api/message/contacts' 或其他路径
    CHAT_HISTORY: '/api/system/message/list',    // 可改为: '/api/message/history' 或其他路径
    SEND_MESSAGE: '/api/system/message',       // 可改为: '/api/message/send' 或其他路径
    USER_INFO: '/api/system/user',                  // 可改为: '/api/user' 或其他路径
};

/** 获取聊天对象列表 */
export async function getChatContactList(params?: ChatContactListParams) {
    // 默认数据
    const defaultData = [
        {
            userId: 2,
            userName: '张三',
            avatar: '',
            lastMessage: '你好，请问有什么可以帮助你的吗？',
            lastMessageTime: new Date(Date.now() - 1000 * 60 * 30),
            unreadCount: 2
        },
        {
            userId: 3,
            userName: '李四',
            avatar: '',
            lastMessage: '关于最近的活动，我想了解更多细节。',
            lastMessageTime: new Date(Date.now() - 1000 * 60 * 60 * 2),
            unreadCount: 0
        },
        {
            userId: 4,
            userName: '王五',
            avatar: '',
            lastMessage: '好的，我知道了，谢谢！',
            lastMessageTime: new Date(Date.now() - 1000 * 60 * 60 * 24),
            unreadCount: 1
        }
    ];

    try {
        const queryString = params
            ? `?${new URLSearchParams(params as Record<string, any>).toString()}`
            : '';
        const response = await request(`${API_CONFIG.CHAT_CONTACTS}${queryString}`, {
            method: 'get',
        });

        // 如果接口返回空数据，使用默认数据
        if (!response || response.length === 0) {
            return defaultData;
        }
        return response;
    } catch (error) {
        // 接口报错时返回默认数据
        console.warn('获取聊天对象列表接口异常，使用默认数据:', error);
        return defaultData;
    }

}

/** 获取与指定用户的聊天记录 */
export async function getChatHistory(params: ChatHistoryParams) {
    // 默认数据
    const defaultData = [
        {
            messageId: 1,
            senderId: params.userId,
            receiverId: params.currentUserId || 1,
            content: `这是来自用户${params.userId}的第一条消息`,
            createTime: new Date(Date.now() - 1000 * 60 * 60 * 2),
            delFlag: '0'
        },
        {
            messageId: 2,
            senderId: params.currentUserId || 1,
            receiverId: params.userId,
            content: '收到，感谢你的消息',
            createTime: new Date(Date.now() - 1000 * 60 * 60),
            delFlag: '0'
        },
        {
            messageId: 3,
            senderId: params.userId,
            receiverId: params.currentUserId || 1,
            content: `这是来自用户${params.userId}的最新消息，包含更多详细信息`,
            createTime: new Date(Date.now() - 1000 * 60 * 30),
            delFlag: '0'
        }
    ];

    // try {
    //     const queryString = `?${new URLSearchParams(params as Record<string, any>).toString()}`;
    //     const response = await request(`${API_CONFIG.CHAT_HISTORY}${queryString}`, {
    //         method: 'get',
    //     });

    //     // 如果接口返回空数据，使用默认数据
    //     if (!response || response.length === 0) {
    //         return defaultData;
    //     }
    //     return response;
    // } catch (error) {
    //     // 接口报错时返回默认数据
    //     console.warn('获取聊天记录接口异常，使用默认数据:', error);
    //     return defaultData;
    // }
    return defaultData;
}

/** 发送消息 */
export async function sendMessage(params: SendMessageParams) {
    try {
        return await request(API_CONFIG.SEND_MESSAGE, {
            method: 'post',
            data: params,
        });
    } catch (error) {
        // 发送消息失败时记录错误但不返回默认数据，让组件处理错误
        console.error('发送消息接口异常:', error);
        throw error; // 重新抛出错误，让调用方处理
    }
}

/** 获取用户信息（用于聊天对象显示） */
export async function getUserInfo(userId: number) {
    // 默认用户信息
    const defaultUserInfo = {
        userId,
        userName: `用户${userId}`,
        avatar: ''
    };

    try {
        const response = await request(`${API_CONFIG.USER_INFO}/${userId}`, {
            method: 'get',
        });

        if (!response) {
            return defaultUserInfo;
        }
        return response;
    } catch (error) {
        // 接口报错时返回默认用户信息
        console.warn(`获取用户${userId}信息接口异常，使用默认数据:`, error);
        return defaultUserInfo;
    }
}