import { Request, Response } from 'express';
import { PaginationHelper } from '../helpers/paginate';
import db from '../models'; // Adjust the path to your models folder if necessary
const TaskModel = db.Task;
const TaskHistoryModel = db.TaskHistory;
const ProjectMasterModel = db.ProjectMaster;
const ClientMasterModel = db.ClientMaster;
const UserModel = db.User;
const PlanModel = db.Plan;
import { Op } from 'sequelize';
import { UserData } from '../helpers/userToken';

//get the client_master list
export const getClientList = async (req: Request, res: Response): Promise<void> => {
    try {
        const { page, per_page, search, type } = req.query;
        const { limit, offset } = PaginationHelper.getPaginationParams(
            page as string | number | undefined, 
            per_page as string | number | undefined
        );

        // Base where clause
        let whereClause: any = {};

        if(type !== 'all') {
            whereClause.is_active = true
        }

        // Add search condition if search parameter exists
        if (search && typeof search === 'string') {
            whereClause = {
                ...whereClause,
                client_name: {
                    [Op.iLike]: `%${search}%` // Case-insensitive search
                }
            };
        }
        
        const result = await ClientMasterModel.findAll({
            where: whereClause,
            order: [['client_name', 'ASC']],
            attributes: { 
                exclude: ['createdAt', 'updatedAt'] 
            }
            //include projects
            // include: [
            //     { model: ProjectMasterModel, as: 'projects', attributes: ['project_name'] }
            // ],
            // limit: limit,
        });

        // if (result.count === 0) {
        //     res.status(200).json({ 
        //         success: true, 
        //         data: [],
        //         pagination: {
        //             total_records: 0,
        //             total_perpage: limit,
        //             total_pages: 0,
        //             current_page: 1,
        //             next_page: null,
        //             previous_page: null
        //         }
        //     });
        //     return;
        // }

        // const paginatedResult = PaginationHelper.paginate({
        //     data: result.rows,
        //     count: result.count,
        //     per_page: limit,
        //     page: page as string
        // });
        
        res.status(200).json({
            success: true,
            data: result,
            // pagination: paginatedResult.pagination
        });
    } catch (error) {
        console.error('Error fetching client list:', error);
        res.status(500).json({
            success: false,
            message: 'Internal server error',
            error: error instanceof Error ? error.message : 'An unknown error occurred',
        });
    }
};

//Create and Edit and is_ative false the client
export const createClient = async (req: Request, res: Response): Promise<void> => {
    try {
        const { id, client_name, is_active } = req.body;
        const userId = (req.user as UserData).user_data.id;

        let result;
        // Create or update the client
        const clientData = {
            client_name,
            created_by: userId,
            is_active
        };

        if(id){
            result = await ClientMasterModel.update(clientData, { where: { id } });
        }
        else{
            result = await ClientMasterModel.create(clientData);
        }
        let msg
        if (!id) {
            msg = 'Client Created';
        } else if (typeof is_active !== 'undefined') {
            msg = is_active === 'false' || is_active === false ? 'Client Deactivated' : 'Client Updated';
        } else {
            msg = 'Client Updated';
        }
        
        res.status(200).json({
            success: true,
            message:msg
        });
    } catch (error) {
        console.error('Error creating/updating client:', error);
        res.status(500).json({
            success: false,
            message: 'Internal server error',
            error: error instanceof Error ? error.message : 'An unknown error occurred',
        });
    }
};

export const getConfigStats = async (req: Request, res: Response): Promise<void> => {
    try {
        //fetch active clients count
        const activeClientsCount = await ClientMasterModel.count({
            where: { is_active: true }
        });

        //fetch active project count
        const activeProjectCount = await ProjectMasterModel.count({
            where: { is_active: true }
        });

        //fetch active users count
        const activeUserCount = await UserModel.count({
            where: { isActive: true }
        });

        res.status(200).json({
            success: true,
            message: "Config Stats Count fetched successfully",
            data: {
                active_clients: activeClientsCount,
                active_projects: activeProjectCount,
                active_users: activeUserCount
            }
        })

    } catch (error) {
        console.error('Error fetching config stats:', error);
        res.status(500).json({
            success: false,
            message: 'Internal server error',
            error: error instanceof Error ? error.message : 'An unknown error occurred',
        });
    }
}