const { pool } = require('../config/database');

// 创建群组表
const createGroupTable = async () => {
    try {
        await pool.query(`
            CREATE TABLE IF NOT EXISTS groups (
                id INT AUTO_INCREMENT PRIMARY KEY,
                group_id VARCHAR(50) NOT NULL UNIQUE,
                group_name VARCHAR(100) NOT NULL,
                creator_id VARCHAR(50) NOT NULL,
                is_active BOOLEAN DEFAULT TRUE,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        `);
    } catch (error) {
        console.error('创建群组表失败:', error);
    }
};

// 初始化表
createGroupTable();

// 群组相关方法
const Group = {
    // 获取所有群组
    findAll: async () => {
        try {
            const [rows] = await pool.query('SELECT * FROM groups ORDER BY created_at DESC');
            return rows;
        } catch (error) {
            console.error('查询群组列表失败:', error);
            throw error;
        }
    },

    // 根据ID查找群组
    findById: async (id) => {
        try {
            const [rows] = await pool.query(
                'SELECT * FROM groups WHERE id = ?',
                [id]
            );
            return rows[0];
        } catch (error) {
            console.error('查询群组失败:', error);
            throw error;
        }
    },

    // 根据群组ID查找群组
    findByGroupId: async (groupId) => {
        const [rows] = await pool.query(
            'SELECT * FROM groups WHERE group_id = ?',
            [groupId]
        );
        return rows[0];
    },

    // 创建群组
    create: async ({ 
        group_id, 
        group_name, 
        group_type = 'group',
        creator_id,
        admin_id,
        in_fee_rate = 0,
        in_exchange_rate = 1,
        out_fee_rate = 0,
        out_exchange_rate = 1
    }) => {
        try {
            const [result] = await pool.query(
                `INSERT INTO groups (
                    group_id, 
                    group_name, 
                    group_type,
                    creator_id,
                    admin_id,
                    in_fee_rate,
                    in_exchange_rate,
                    out_fee_rate,
                    out_exchange_rate
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
                [
                    group_id,
                    group_name,
                    group_type,
                    creator_id,
                    admin_id,
                    in_fee_rate,
                    in_exchange_rate,
                    out_fee_rate,
                    out_exchange_rate
                ]
            );
            return result.insertId;
        } catch (error) {
            console.error('创建群组失败:', error);
            throw error;
        }
    },

    // 更新群组
    update: async (id, { 
        group_name, 
        is_active, 
        in_fee_rate, 
        in_exchange_rate, 
        out_fee_rate, 
        out_exchange_rate 
    }) => {
        try {
            const [result] = await pool.query(
                `UPDATE groups 
                SET group_name = ?,
                    is_active = ?,
                    in_fee_rate = ?,
                    in_exchange_rate = ?,
                    out_fee_rate = ?,
                    out_exchange_rate = ?,
                    updated_at = CURRENT_TIMESTAMP
                WHERE id = ?`,
                [
                    group_name,
                    is_active,
                    in_fee_rate,
                    in_exchange_rate,
                    out_fee_rate,
                    out_exchange_rate,
                    id
                ]
            );

            if (result.affectedRows === 0) {
                throw new Error('群组不存在');
            }

            return result;
        } catch (error) {
            console.error('更新群组失败:', error);
            throw error;
        }
    },

    // 删除群组
    delete: async (id) => {
        try {
            const [result] = await pool.query('DELETE FROM groups WHERE id = ?', [id]);
            if (result.affectedRows === 0) {
                throw new Error('群组不存在');
            }
            return result;
        } catch (error) {
            console.error('删除群组失败:', error);
            throw error;
        }
    },

    // 添加操作人
    addOperator: async (groupId, { operator_id, operator_username, added_by }) => {
        try {
            // 获取当前群组信息
            const [group] = await pool.query(
                'SELECT operators FROM groups WHERE group_id = ?',
                [groupId]
            );

            if (!group[0]) {
                throw new Error('群组不存在');
            }

            // 解析现有的操作人列表,如果为null则初始化为空数组
            const operators = group[0].operators ? JSON.parse(group[0].operators) : [];

            // 检查操作人是否已存在
            if (operators.some(op => op.operator_id === operator_id)) {
                throw new Error('该用户已经是操作人');
            }

            // 添加新操作人
            operators.push({
                operator_id,
                operator_username,
                added_by,
                added_at: new Date().toISOString()
            });

            // 更新群组
            await pool.query(
                'UPDATE groups SET operators = ? WHERE group_id = ?',
                [JSON.stringify(operators), groupId]
            );

            return true;
        } catch (error) {
            console.error('添加操作人失败:', error);
            throw error;
        }
    },

    // 检查用户是否是操作人
    isOperator: async (groupId, operatorId) => {
        try {
            const [group] = await pool.query(
                'SELECT operators FROM groups WHERE group_id = ?',
                [groupId]
            );

            if (!group[0] || !group[0].operators) {
                return false;
            }

            const operators = JSON.parse(group[0].operators);
            return operators.some(op => op.operator_id === operatorId);
        } catch (error) {
            console.error('检查操作人状态失败:', error);
            throw error;
        }
    },

    // 获取群组的所有操作人
    getOperators: async (groupId) => {
        try {
            const [group] = await pool.query(
                'SELECT operators FROM groups WHERE group_id = ?',
                [groupId]
            );

            if (!group[0] || !group[0].operators) {
                return [];
            }

            return JSON.parse(group[0].operators);
        } catch (error) {
            console.error('获取群组操作人列表失败:', error);
            throw error;
        }
    },

    // 删除操作人
    removeOperator: async (groupId, operatorId) => {
        try {
            // 获取当前群组信息
            const [group] = await pool.query(
                'SELECT operators FROM groups WHERE group_id = ?',
                [groupId]
            );

            if (!group[0] || !group[0].operators) {
                throw new Error('群组不存在或没有操作人');
            }

            // 解析现有的操作人列表
            const operators = JSON.parse(group[0].operators);

            // 过滤掉要删除的操作人
            const updatedOperators = operators.filter(op => op.operator_id !== operatorId);

            // 如果操作人列表没有变化,说明要删除的操作人不存在
            if (operators.length === updatedOperators.length) {
                return false;
            }

            // 更新群组
            await pool.query(
                'UPDATE groups SET operators = ? WHERE group_id = ?',
                [JSON.stringify(updatedOperators), groupId]
            );

            return true;
        } catch (error) {
            console.error('删除操作人失败:', error);
            throw error;
        }
    }
};

module.exports = Group;