import type { FastifyRequest, FastifyReply } from 'fastify';
import * as orderReturnService from '../services/orderReturn.service.js';
import { PERMISSIONS } from '../constants/permissions.js';

interface RequestReturnBody {
  order_id: string;
  order_product_id: string;
  returned_quantity: number;
  returned_weight: number;
  reason: string;
  target_stage_id: string;
  returned_date: string;
  next_delivery_date?: string | null;
}

interface UpdateReturnBody {
  returned_quantity: number;
  returned_weight: number;
  reason: string;
  target_stage_id: string;
  returned_date: string;
  next_delivery_date?: string | null;
}

export async function requestHandler(request: FastifyRequest, _reply: FastifyReply) {
  const body = request.body as RequestReturnBody;
  return orderReturnService.submitForRequest(body, request.user.id);
}

export async function createDirectHandler(request: FastifyRequest, _reply: FastifyReply) {
  const body = request.body as RequestReturnBody;
  return orderReturnService.createDirect(body, request.user.id);
}

export async function listAllHandler(request: FastifyRequest, _reply: FastifyReply) {
  const { status, employeeId, dateFrom, dateTo } = request.query as {
    status?: string; employeeId?: string; dateFrom?: string; dateTo?: string;
  };
  const data = await orderReturnService.listAll({ status, employeeId, dateFrom, dateTo });
  return { data };
}

export async function listPendingHandler(request: FastifyRequest, _reply: FastifyReply) {
  const { employeeId, dateFrom, dateTo } = request.query as { employeeId?: string; dateFrom?: string; dateTo?: string };
  const data = await orderReturnService.listPending({ employeeId, dateFrom, dateTo });
  return { data };
}

export async function listOpenHandler(_request: FastifyRequest, _reply: FastifyReply) {
  const data = await orderReturnService.listOpen();
  return { data };
}

export async function getHandler(request: FastifyRequest, _reply: FastifyReply) {
  const { id } = request.params as { id: string };
  return orderReturnService.get(id);
}

export async function approveHandler(request: FastifyRequest, _reply: FastifyReply) {
  const { id } = request.params as { id: string };
  return orderReturnService.approve(id, request.user.id);
}

export async function rejectHandler(request: FastifyRequest, _reply: FastifyReply) {
  const { id } = request.params as { id: string };
  const { reason } = request.body as { reason: string };
  return orderReturnService.reject(id, request.user.id, reason);
}

export async function revertHandler(request: FastifyRequest, _reply: FastifyReply) {
  const { id } = request.params as { id: string };
  return orderReturnService.revert(id, request.user.id);
}

export async function updateHandler(request: FastifyRequest, _reply: FastifyReply) {
  const { id } = request.params as { id: string };
  const body = request.body as UpdateReturnBody;
  const isApprover = request.user.permissions.includes('*') || request.user.permissions.includes(PERMISSIONS.ORDERS_RETURN_APPROVE);
  return orderReturnService.updateRequest(id, body, request.user.id, isApprover);
}
