/* eslint-disable import/prefer-default-export */
import { Request, Response } from 'express';
import { User } from '../models';
import { getOrderCount } from '../utils/auth';
import callService from '../utils/serviceCall';

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

export const markOrderInProgress = async (req: Request, res: Response) => {
  const { orderID } = req.params;
  const { resStatus, resData } = await callService({
    url: `/order/${orderID}/inprogress`,
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'patch',
    payload: req,
  });
  res.status(resStatus).json(resData);
};

export const markOrderAsCancelled = async (req: Request, res: Response) => {
  const { orderID } = req.params;
  const { resStatus, resData } = await callService({
    url: `/order/${orderID}/cancel`,
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'patch',
    payload: req,
  });
  res.status(resStatus).json(resData);
};

export const orderOTP = async (req: Request, res: Response) => {
   const { orderID } = req.params;
   const { resStatus, resData } = await callService({
     url: `/order/${orderID}/otp`,
     baseURL: process.env.ORDER_SERVICE_URL!,
     method: 'get',
     payload: req,
   });
   res.status(resStatus).json(resData);
};

export const markOrderComplete = async (req: Request, res: Response) => {
  const { orderID, otp } = req.params;
  const { resStatus, resData } = await callService({
    url: `/order/${orderID}/complete/${otp}`,
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'patch',
    payload: req,
  });
  if (resStatus === 200) {
    const rider = await User.findById(req.user!._id);
    if (rider) {
      rider.set({
        noOfCompletedOrders: rider.noOfCompletedOrders
          ? rider.noOfCompletedOrders + 1
          : 1,
      });
      await rider.save();
    }
  }
  res.status(resStatus).json(resData);
};

export const markRouteInProgress = async (req: Request, res: Response) => {
  const { routeID } = req.params;
  const { resStatus, resData } = await callService({
    url: `/rider-route/${routeID}/inprogress`,
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'patch',
    payload: req,
  });
  if (resStatus === 200) {
    const orderCount = getOrderCount(resData.data.routes);
    const rider = await User.findById(req.user!._id);
    if (rider) {
      rider.set({
        noOfAssignedOrders: rider.noOfAssignedOrders
          ? rider.noOfAssignedOrders + orderCount
          : orderCount,
        inTransit: true,
      });
      await rider.save();
    }
  }
  res.status(resStatus).json(resData);
};

export const markRouteComplete = async (req: Request, res: Response) => {
  const { routeID } = req.params;
  const { resStatus, resData } = await callService({
    url: `/rider-route/${routeID}/complete`,
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'patch',
    payload: req,
  });
  if (resStatus === 200) {
    const rider = await User.findById(req.user!._id);
    if (rider) {
      rider.set({
        inTransit: false,
      });
      await rider.save();
    }
  }
  res.status(resStatus).json(resData);
};
