import { Request, Response } from 'express';

const genUserList = (current: number, pageSize: number) => {
    const tableListDataSource: any[] = [];

    for (let i = 0; i < pageSize; i += 1) {
        const index = (current - 1) * 10 + i;
        tableListDataSource.push({
            id: `${index}`,
            username: `user_${index}`,
            realName: `用户 ${index}`,
            mobile: `138001380${index.toString().padStart(2, '0')}`,
            email: `user_${index}@antgravity.com`,
            role: index % 2 === 0 ? 'admin' : 'user',
            status: ['active', 'disabled', 'pending'][index % 3],
            createdAt: new Date().toISOString(),
            updatedAt: new Date().toISOString(),
        });
    }
    return tableListDataSource;
};

let tableListDataSource = genUserList(1, 20);

function getUserList(req: Request, res: Response, u: string) {
    let realUrl = u;
    if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
        realUrl = req.url;
    }
    const { current = 1, pageSize = 10, username, realName, role, status } = req.query;

    let dataSource = [...tableListDataSource];

    if (username) {
        dataSource = dataSource.filter((item) => item.username.includes(username as string));
    }
    if (realName) {
        dataSource = dataSource.filter((item) => item.realName.includes(realName as string));
    }
    if (role) {
        dataSource = dataSource.filter((item) => item.role === role);
    }
    if (status) {
        dataSource = dataSource.filter((item) => item.status === status);
    }

    const result = {
        data: dataSource,
        total: dataSource.length,
        success: true,
        pageSize,
        current: parseInt(`${current}`, 10) || 1,
    };

    return res.json(result);
}

function postUser(req: Request, res: Response, u: string, b: Request) {
    const body = (b && b.body) || req.body;
    const { method, id } = req;

    switch (method) {
        case 'POST':
            const i = Math.ceil(Math.random() * 10000);
            const newUser = {
                id: `${i}`,
                ...body,
                createdAt: new Date().toISOString(),
                updatedAt: new Date().toISOString(),
            };
            tableListDataSource.unshift(newUser);
            return res.json(newUser);

        case 'PUT':
            // The id in URL is usually available as req.params.id for Express routes, 
            // but Umi mock matches implementation might vary. 
            // Assuming RESTful style: /api/users/:id
            // We need to parse ID from URL if not provided directly.
            // Simplification for mock: assume ID is passed or parsed.
            let updateId = id;
            if (!updateId) {
                // rough parsing for /api/users/123
                const parts = req.url.split('/');
                updateId = parts[parts.length - 1];
            }

            tableListDataSource = tableListDataSource.map((item) => {
                if (item.id === updateId) {
                    return { ...item, ...body, updatedAt: new Date().toISOString() };
                }
                return item;
            });
            return res.json({ id: updateId, ...body });

        case 'DELETE':
            let deleteId = id;
            if (!deleteId) {
                const parts = req.url.split('/');
                deleteId = parts[parts.length - 1];
            }
            tableListDataSource = tableListDataSource.filter((item) => item.id !== deleteId);
            return res.json({ success: true });

        default:
            break;
    }
    return res.json({ result: 'Error' });
}

export default {
    'GET /api/users': getUserList,
    'POST /api/users': postUser,
    'PUT /api/users/:id': postUser,
    'DELETE /api/users/:id': postUser,
};
