import { ApprovalStatus } from "@prisma/client";
import { z } from "zod";

export const createTaskSchema = z.object({
  body: z.object({
    serviceId: z.string().min(1, "Service is required"),
    title: z.string().min(1, "Title is required"),
    description: z.string().optional(),
    dueDate: z.coerce.date().optional(),
  }),
  query: z.object({}).optional(),
  params: z.object({}).optional(),
});

export const getTasksSchema = z.object({
  body: z.object({}).optional(),
  query: z
    .object({
      page: z.string().optional(),
      limit: z.string().optional(),
      status: z.string().optional(),
    })
    .optional(),
  params: z.object({}).optional(),
});

export const updateTaskSchema = z.object({
  body: z
    .object({
      title: z.string().min(1).optional(),
      description: z.string().optional(),
      dueDate: z.coerce.date().optional(),
      status: z
        .enum(["PENDING", "IN_PROGRESS", "COMPLETED", "CANCELLED"])
        .optional(),
    })
    .refine((data) => Object.keys(data).length > 0, {
      message: "At least one field is required to update",
    }),
  query: z.object({}).optional(),
  params: z.object({
    taskId: z.string().min(1, "Task id is required"),
  }),
});

export const taskIdParamSchema = z.object({
  body: z.object({}).optional(),
  query: z.object({}).optional(),
  params: z.object({
    taskId: z.string().min(1, "Task id is required"),
  }),
});

// ── ADMIN ────────────────────────────────────────────────────

export const adminGetTasksSchema = z.object({
  body: z.object({}).optional(),
  query: z
    .object({
      page: z.string().optional(),
      limit: z.string().optional(),
      status: z
        .enum([
          "PENDING",
          "IN_PROGRESS",
          "EMPLOYEE_DONE",
          "MANAGER_APPROVAL",
          "CLIENT_APPROVAL",
          "FILING_PENDING",
          "COMPLETED",
          "REJECTED",
        ])
        .optional(),
      search: z.string().optional(),
      clientId: z.string().optional(),
      departmentId: z.string().optional(),
      assignedEmployeeId: z.string().optional(),
      priority: z.enum(["LOW", "MEDIUM", "HIGH", "URGENT"]).optional(),
    })
    .optional(),
  params: z.object({}).optional(),
});

export const adminUpdateTaskSchema = z.object({
  body: z
    .object({
      status: z
        .enum([
          "PENDING",
          "IN_PROGRESS",
          "EMPLOYEE_DONE",
          "MANAGER_APPROVAL",
          "CLIENT_APPROVAL",
          "FILING_PENDING",
          "COMPLETED",
          "REJECTED",
        ])
        .optional(),
      assignedEmployeeId: z.string().optional(),
      departmentId: z.string().optional(),
      priority: z.enum(["LOW", "MEDIUM", "HIGH", "URGENT"]).optional(),
      dueDate: z.string().optional(),
      title: z.string().min(1).optional(),
      description: z.string().optional(),
    })
    .refine((d) => Object.keys(d).length > 0, {
      message: "At least one field required",
    }),
  query: z.object({}).optional(),
  params: z.object({ taskId: z.string().min(1) }),
});

// export const managerDecisionSchema = z.object({
//   body: z.object({
//     status: z.enum([ApprovalStatus.APPROVED, ApprovalStatus.REJECTED]),
//     remarks: z.string().optional(),
//   }),
// });

export const managerDecisionSchema = z.object({
  body: z
    .object({
      status: z.enum(["APPROVED", "REJECTED"]),
      remarks: z.string().optional(),
    })
    .refine(
      (data) =>
        data.status !== "REJECTED" ||
        (data.remarks && data.remarks.trim().length > 0),
      { message: "Remarks are required to reject a task", path: ["remarks"] },
    ),
});
