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

export const recommendRoute = async (req: Request, res: Response) => {
  const validAccess = await verifyAccess(req, 'create_orders');
  if (!validAccess) {
    res.status(403).json({
      success: false,
      message: 'Access denied',
    });
    return;
  }
  const { resStatus, resData } = await callService({
    url: '/route/request',
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'post',
    payload: req,
  });
  res.status(resStatus).json(resData);
};

export const skipOptRoute = async (req: Request, res: Response) => {
  const validAccess = await verifyAccess(req, 'create_orders');
  if (!validAccess) {
    res.status(403).json({
      success: false,
      message: 'Access denied',
    });
    return;
  }
  const { resStatus, resData } = await callService({
    url: '/route/skip-optimize',
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'post',
    payload: req,
  });
  res.status(resStatus).json(resData);
};

export const saveRoute = async (req: Request, res: Response) => {
  const validAccess = await verifyAccess(req, 'create_orders');
  if (!validAccess) {
    res.status(403).json({
      success: false,
      message: 'Access denied',
    });
    return;
  }
  const { resStatus, resData } = await callService({
    url: '/route/save',
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'post',
    payload: req,
  });
  res.status(resStatus).json(resData);
};

export const getRoutes = async (req: Request, res: Response) => {
  const validAccess = await verifyAccess(req, 'view_orders');
  if (!validAccess) {
    res.status(403).json({
      success: false,
      message: 'Access denied',
    });
    return;
  }
  const { resStatus, resData } = await callService({
    url: '/route/get',
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'get',
    payload: req,
  });
  res.status(resStatus).json(resData);
};

export const assignRoute = async (req: Request, res: Response) => {
  const validAccess = await verifyAccess(req, 'create_orders');
  if (!validAccess) {
    res.status(403).json({
      success: false,
      message: 'Access denied',
    });
    return;
  }
  const { company_id } = req.user!;
  const { routeID, riderID } = req.params;
  const rider = await User.findOne({
    _id: riderID,
    userType: 'rider',
    company_id,
    isActive: true,
  });

  if (!rider) {
    res.status(404).json({
      success: false,
      message: 'Rider does not exist',
    });
    return;
  }

  //add the rider's device tokens to the request
  req.body.riderDeviceTokens = rider.deviceTokens;
  const { resStatus, resData } = await callService({
    url: `/route/${routeID}/assign/${riderID}`,
    baseURL: process.env.ORDER_SERVICE_URL!,
    method: 'post',
    payload: req,
  });
  res.status(resStatus).json(resData);
};
