
import { Request, Response } from "express";
import { SalesPersons } from "../../database/salesPersons/salesPersons";
import { sendErrorResponse, sendSuccessResponse } from "../../utills/response";
import { messages } from "../../utills/common";

// Create new SalesPerson
export const createSalesPerson = async (req: Request, res: Response) => {
    try {
        const { name, email, phone, referralCode, 
            commission } = req.body;
        // Check if the email already exists in the database
        const existingsalesPersons = await SalesPersons.findOne({ where: { email } });
        if (existingsalesPersons)  return sendErrorResponse(res, 400, messages.emailExists);
        const newSalesPersons = await SalesPersons.create({
            name, email, phone, referralCode, 
            commission
        }).save();

        return sendSuccessResponse(res, 200, messages.createSalesPersons, newSalesPersons);
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

// get all salesPersons
export const salespersons = async (req: Request, res: Response) => {
    try {
        const { page = '1', limit = '10', search } = req.query;
        const pageNum = Math.max(1, parseInt(page as string, 10));
        const limitNum = Math.max(1, Math.min(100, parseInt(limit as string, 10)));
        const skip = (pageNum - 1) * limitNum;

        let salesPersonsQuery = SalesPersons.createQueryBuilder("salesPersons")
            .orderBy("salesPersons.created_at", "DESC");

        if (search) {
            salesPersonsQuery = salesPersonsQuery.andWhere(
                "(salesPersons.name LIKE :search OR salesPersons.email LIKE :search OR salesPersons.phone LIKE :search OR salesPersons.referralCode LIKE :search OR salesPersons.commission LIKE :search)",
                { search: `%${search}%` }
            );
        }

        const [salesPersonss, totalCount] = await salesPersonsQuery
            .skip(skip)
            .take(limitNum)
            .getManyAndCount();

        const totalPages = Math.ceil(totalCount / limitNum);

        return sendSuccessResponse(res, 200, messages.salesPersonsMsg, {
            salesPersons: salesPersonss,
            pagination: {
                currentPage: pageNum,
                totalPages,
                totalCount,
                limit: limitNum
            }
        });
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

//  Delete salePerson by id
export const deleteSalespersonsById = async (req: Request, res: Response) => {
    try {
        const id = req.params.id;
        const deletionResult = await SalesPersons.delete({id });
        if (deletionResult.affected === 1) {
            return sendSuccessResponse(res, 200, messages.deleteUser, "");
        } else {
            return sendErrorResponse(res, 404, messages.userNotFound);
        }
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

//  get salePerson by id
export const getSalePersonById = async (req: Request, res: Response) => {
    try {
        const id = req.params.id;
        const salePerson = await SalesPersons.createQueryBuilder()
        .where({id})
        .getOne();

        return sendSuccessResponse(res, 200, messages.salespersonsMsg, salePerson);
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

// Update salePerson by id
export const updateSalesPerson = async (req: Request, res: Response) => {
    try {
        const { id, name, email, phone, referralCode, 
            commission  } = req.body;
            await SalesPersons.createQueryBuilder()
            .update()
            .set({
                name, email, phone, referralCode, 
                commission  })
            .where({ id })
            .execute();
            const updatedsalesPersons = await SalesPersons.findOne({ where: { id } });

            return sendSuccessResponse(res, 200, messages.updateMsg, updatedsalesPersons);
    } catch (error) {
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};
