import { NextFunction, Request, Response } from "express";
import { ApiResponse } from "../../middleware/ApiResponse";
import { CatchAsyncError } from "../../middleware/Catch";
import { ApiError } from "../../middleware/ApiError";
import { WebsiteService } from "../websites/website.service";
import { url } from "inspector";
import { WebsiteReportService } from "./report.service";

export const getWebSitesReport = CatchAsyncError(async (req: Request, res: Response, next: NextFunction) => {

    // const response = await WebsiteService.getAllWebsites();

    const id = req.params.webId as string;

    const { todate, fromdate } = req.query as { todate: string, fromdate: string }




    if (!id) {
        throw new ApiError("Id not Found", 404);
    }

    const GetWebsites = await WebsiteService.getUniqueWebsites(id);



    if (!GetWebsites) {
        throw new ApiError("Website not found", 404);
    }




    const [leads, order] = await Promise.all([
        WebsiteReportService.getWebsiteReport(GetWebsites.url, GetWebsites.token, todate, fromdate),
        WebsiteReportService.getBramikalpreport(todate, fromdate)
    ]);






    type WebsiteData = {
        website: string;
        leads: number;
        checkout: number;
        rate: number;
        live: string;
    };

    const response: WebsiteData[] = [];

    if (Array.isArray(leads?.data?.all) && Array.isArray(order?.data)) {

        for (const lead of leads.data.all) {

            const matchingOrder = order.data.find((o: { website: string }) => o.website.toLowerCase() === (lead.form_blogname as string).toLowerCase());


            const leadCount = lead.num_rows || 0;
            const orderCount = matchingOrder?.total_orders || 0;

            const rate = leadCount > 0 ? (orderCount * 100) / leadCount : 0;

            response.push({
                website: lead.form_blogname,
                leads: leadCount,
                checkout: orderCount,
                rate: parseFloat(rate.toFixed(2)),
                live: "Continue...",
            });
        }

    }








    return res.status(200).json(
        new ApiResponse(
            "Get Report Data",
            200,
            response,
            {
                id
            }
        )
    )

})
