import { Request, Response } from 'express';
import { User, Asset } from '../models';
import callService from '../utils/serviceCall';

export const getDashBoard = async (req: Request, res: Response) => {
  const { company_id } = req.user!;
  const ridersPromise = User.find({
    company_id,
    userType: 'rider',
  });

  const assetsPromise = Asset.find({ company_id });
  const data = await Promise.all([ridersPromise, assetsPromise]);
  const riders = data[0];
  const assets = data[1];

  const totalNumberOfRiders = riders.length;
  const totalNumberOfRidersInTransit = riders.filter(
    ({ inTransit, isActive }) => inTransit && isActive,
  ).length;
  const totalNumberOfRidersUnassigned =
    totalNumberOfRiders - totalNumberOfRidersInTransit;

  const totalNumberOfAssets = assets.length;
  const totalNumberOfAssignedAssets = assets.filter(
    ({ assignee }) => !!assignee,
  ).length;
  const totalNumberOfUnassignedAssets =
    totalNumberOfAssets - totalNumberOfAssignedAssets;

  const { resStatus, resData } = await callService({
    url: '/dashboard',
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'get',
    payload: req,
  });

  if (resStatus !== 200) {
    return res.status(resStatus).json(resData);
  }

  const { dashboard } = resData.data;

  const dashBoardObject = {
    success: true,
    message: 'Dashboard data successfully retrieved',
    data: {
      ...dashboard,
      riders: {
        totalNumberOfRiders,
        totalNumberOfRidersInTransit,
        totalNumberOfRidersUnassigned,
      },
      assets: {
        totalNumberOfAssets,
        totalNumberOfAssignedAssets,
        totalNumberOfUnassignedAssets,
      },
    },
  };

  return res.status(201).json(dashBoardObject);
};

export const getDashBoardStats = async (req: Request, res: Response) => {
  const { resStatus, resData } = await callService({
    url: '/dashboard-stats',
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'get',
    payload: req,
  });

  return res.status(resStatus).json(resData);
};

export const getNotifications = async (req: Request, res: Response) => {
  const { resStatus, resData } = await callService({
    url: '/notifications',
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'get',
    payload: req,
  });

  return res.status(resStatus).json(resData);
};
