import { Request, Response } from "express";
import { UserPortfolio } from "../../database/transaction/usersPortfolio";
import { messages } from "../../utills/common";
import { sendErrorResponse, sendSuccessResponse } from "../../utills/response";

export const getDailyLedger = 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;

        // Build query for daily ledger
        let dailyLedgerQuery = UserPortfolio.createQueryBuilder("userPortfolio")
            .select([
                "userPortfolio.investedAmount AS starting_amount",
                "userPortfolio.dayEndPortfolio AS ending_amount",
                "userPortfolio.dailyProfitAmount AS profit",
                "ROUND(userPortfolio.dailyProfitPercentage, 2) AS profit_percentage",
                "ROUND(userPortfolio.dailyProfitAmount * 0.2, 2) AS quant_profit",
                "ROUND(userPortfolio.dailyProfitAmount * 0.8, 2) AS investors_profit",
                "userPortfolio.created_at AS date",
                "userPortfolio.id AS id"
            ])
            .orderBy("userPortfolio.created_at", "DESC");

        // Apply search filter if provided
        if (search) {
            dailyLedgerQuery = dailyLedgerQuery.andWhere(
                `(DATE_FORMAT(userPortfolio.created_at, '%d %b %Y') LIKE :search
                OR CAST(userPortfolio.investedAmount AS CHAR) LIKE :search
                OR CAST(userPortfolio.dayEndPortfolio AS CHAR) LIKE :search
                OR CAST(userPortfolio.dailyProfitAmount AS CHAR) LIKE :search
                OR CAST(ROUND(userPortfolio.dailyProfitPercentage, 2) AS CHAR) LIKE :search
                OR CAST(ROUND(userPortfolio.dailyProfitAmount * 0.2, 2) AS CHAR) LIKE :search
                OR CAST(ROUND(userPortfolio.dailyProfitAmount * 0.8, 2) AS CHAR) LIKE :search)`,
                { search: `%${search}%` }
            );
        }

        // Get total count for pagination
        const totalCount = await dailyLedgerQuery.getCount();

        // Apply pagination
        const dailyLedger = await dailyLedgerQuery
            .offset(skip)
            .limit(limitNum)
            .getRawMany();

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

        return sendSuccessResponse(res, 200, messages.viewData, {
            dailyLedger,
            pagination: {
                currentPage: pageNum,
                totalPages,
                totalCount,
                limit: limitNum
            }
        });
    } catch (error) {
        console.error("Error fetching daily ledger:", error);
        return sendErrorResponse(res, 500, messages.errorMsg);
    }
};

