import { Response } from "express";
import Vehicle from "../../models/vehicleModel";
import Trip from "../../models/TripModel";
import ResponseUtil from "../../utils/Response/responseUtils";
import { STATUS_CODES } from "../../constants/statusCodes";
import { CustomRequest } from "../../interfaces/auth";

export const listVehicleFuelMetricsAdmin = async (
  req: CustomRequest,
  res: Response
) => {
  try {
    const page = Math.max(parseInt((req.query.page as string) || "1", 10), 1);
    const limit = Math.min(
      Math.max(parseInt((req.query.limit as string) || "20", 10), 1),
      100
    );
    const skip = (page - 1) * limit;

    const filter = { isDeleted: false };
    const [vehicles, total] = await Promise.all([
      Vehicle.find(filter)
        .sort({ updatedAt: -1 })
        .skip(skip)
        .limit(limit)
        .populate("userId", "email fullName")
        .lean(),
      Vehicle.countDocuments(filter),
    ]);

    const enriched = vehicles.map((v) => ({
      ...v,
      currentMPGParse: parseFloat(String(v.currentMPG)) || null,
    }));

    return ResponseUtil.successResponse(
      res,
      STATUS_CODES.SUCCESS,
      {
        total,
        page,
        limit,
        totalPages: Math.ceil(total / limit),
        vehicles: enriched,
      },
      "Vehicle fuel-related metrics (MPG per registered car)"
    );
  } catch (e) {
    ResponseUtil.handleError(res, e);
  }
};

export const fuelEfficiencySummaryAdmin = async (
  req: CustomRequest,
  res: Response
) => {
  try {
    const vehicles = await Vehicle.find({ isDeleted: false })
      .select("currentMPG tankCapacity userId")
      .lean();
    let mpgSum = 0;
    let mpgCount = 0;
    for (const v of vehicles) {
      const n = parseFloat(String(v.currentMPG));
      if (!isNaN(n) && n > 0) {
        mpgSum += n;
        mpgCount += 1;
      }
    }
    const avgMpg = mpgCount ? mpgSum / mpgCount : null;

    const tripAgg = await Trip.aggregate([
      { $match: { isDeleted: false } },
      {
        $group: {
          _id: null,
          totalTrips: { $sum: 1 },
          totalDistanceKm: { $sum: "$calculatedDistance" },
        },
      },
    ]);

    const summary = tripAgg[0] || {
      totalTrips: 0,
      totalDistanceKm: 0,
    };

    return ResponseUtil.successResponse(
      res,
      STATUS_CODES.SUCCESS,
      {
        registeredVehicles: vehicles.length,
        avgMpgReported: avgMpg,
        vehiclesWithMpg: mpgCount,
        historicalTrips: {
          count: summary.totalTrips,
          totalDistanceKm: summary.totalDistanceKm,
        },
        note: "Extend with time-series storage or external analytics for deeper trends.",
      },
      "Fuel efficiency aggregate summary"
    );
  } catch (e) {
    ResponseUtil.handleError(res, e);
  }
};
