import { Router } from "express";
import { authMiddleware } from "../../common/middlewares/auth.middleware";
import { tenantMiddleware } from "../../common/middlewares/tenant.middleware";
import { validate } from "../../common/middlewares/validate.middleware";
import {
  getTasksSchema,
  taskIdParamSchema,
  adminGetTasksSchema,
  adminUpdateTaskSchema,
  managerDecisionSchema,
  updateTaskSchema,
} from "./task.validation";
import {
  attachClientContext,
  uploadAnyTaskFiles,
  attachAdminClientContext,
} from "../../common/middlewares/cloudinary-upload.middleware";
import * as taskController from "./task.controller";
import taskDocumentRoutes from "../task-documents/task-document.routes";
import * as taskDocCtrl from "../task-documents/task-document.controller";
import "./task.openapi";

const router = Router();

router.use(authMiddleware, tenantMiddleware);

// ── EMPLOYEE routes ── (static before /:taskId)
router.get("/employee/tasks", taskController.getEmployeeTasks);
router.get("/employee/tasks/:taskId", taskController.getEmployeeTask);
router.patch("/:taskId/approval", taskController.taskApproval);
router.patch("/:taskId/approve", taskController.employeeApproveTask);

// ── MANAGER routes ── (static before /:taskId)
router.get("/manager/tasks", taskController.getManagerTasks);
router.patch(
  "/manager/:taskId/approve",
  validate(managerDecisionSchema),
  taskController.managerDecideTask,
);
router.get("/manager/tasks/:taskId", taskController.getManagerTask);

// ── ADMIN routes ── (all static segments first, then /:taskId last)
router.get("/admin/stats", taskController.adminGetTaskStats);
router.get(
  "/admin/all",
  validate(adminGetTasksSchema),
  taskController.adminGetTasks,
);
router.get("/admin/clients/active", taskController.adminGetActiveClients);
router.get("/admin/employees/active", taskController.adminGetActiveEmployees);
router.get(
  "/admin/departments/:departmentId/employees",
  taskController.adminGetEmployeesByDepartment,
);
router.post(
  "/admin/create",
  attachAdminClientContext,
  uploadAnyTaskFiles,
  taskController.adminCreateTask,
);
// admin /:taskId routes (dynamic — must come after all static admin routes)
router.get("/admin/:taskId", taskController.adminGetTask);
router.patch(
  "/admin/:taskId",
  validate(adminUpdateTaskSchema),
  taskController.adminUpdateTask,
);
router.delete("/admin/:taskId", taskController.adminDeleteTask);
router.post(
  "/admin/:taskId/documents",
  attachAdminClientContext,
  uploadAnyTaskFiles,
  taskDocCtrl.adminUploadDocuments,
);
router.delete(
  "/admin/:taskId/documents/:documentId",
  taskDocCtrl.adminDeleteDocument,
);

// ── CLIENT routes ── (static before /:taskId)
router.post(
  "/create-task",
  attachClientContext,
  uploadAnyTaskFiles,
  taskController.createTaskWithDocuments,
);
router.get("/rejections", taskController.getClientRejections);
router.get("/", validate(getTasksSchema), taskController.getTasks);

// client /:taskId routes (dynamic — must come after all static client routes)
router.get("/:taskId/rejections", taskController.getTaskRejections);
router.get("/:taskId", taskController.getTask);
router.put(
  "/:taskId",
  attachClientContext,
  uploadAnyTaskFiles,
  validate(updateTaskSchema),
  taskController.updateTask,
);
router.delete(
  "/:taskId",
  validate(taskIdParamSchema),
  taskController.deleteTask,
);
router.use("/:taskId/documents", taskDocumentRoutes);
router.patch("/:taskId/client-approve", taskController.clientDecideTask);

export default router;
