import { axiosClient } from "@/lib/axios";
import { ApiResponse } from "@/types/api.types";
import { PaginationMeta, PaginationParams, buildQueryParams } from "@/lib/pagination";
import { ActiveEmployee, AdminTask, AdminUpdateTaskPayload } from "../types/task.type";

export interface ActiveClient {
  id: string;
  name: string;
  email: string;
  companyName: string | null;
  status: string;
}

export const adminTaskService = {
  getTasks: async (
    params: PaginationParams & { clientId?: string; departmentId?: string; assignedEmployeeId?: string; priority?: string }
  ): Promise<ApiResponse<AdminTask[]> & { meta: PaginationMeta }> => {
    const qs = buildQueryParams(params);
    const extra = new URLSearchParams();
    if (params.clientId) extra.set("clientId", params.clientId);
    if (params.departmentId) extra.set("departmentId", params.departmentId);
    if (params.assignedEmployeeId) extra.set("assignedEmployeeId", params.assignedEmployeeId);
    if (params.priority && params.priority !== "ALL") extra.set("priority", params.priority);
    const query = [qs, extra.toString()].filter(Boolean).join("&");
    const res = await axiosClient.get(`/tasks/admin/all?${query}`);
    return res.data;
  },

  getTask: async (taskId: string): Promise<ApiResponse<AdminTask>> => {
    const res = await axiosClient.get(`/tasks/admin/${taskId}`);
    return res.data;
  },

  updateTask: async (
    taskId: string,
    payload: AdminUpdateTaskPayload
  ): Promise<ApiResponse<AdminTask>> => {
    const res = await axiosClient.patch(`/tasks/admin/${taskId}`, payload);
    return res.data;
  },

  getActiveEmployees: async (): Promise<ApiResponse<ActiveEmployee[]>> => {
    const res = await axiosClient.get(`/tasks/admin/employees/active`);
    return res.data;
  },

  getActiveClients: async (params: { search?: string; page?: number; limit?: number }): Promise<ApiResponse<ActiveClient[]> & { meta: any }> => {
    const qs = new URLSearchParams();
    if (params.search) qs.set("search", params.search);
    qs.set("page", String(params.page ?? 1));
    qs.set("limit", String(params.limit ?? 10));
    const res = await axiosClient.get(`/tasks/admin/clients/active?${qs.toString()}`);
    return res.data;
  },

  getEmployeesByDepartment: async (departmentId: string, params?: { search?: string }): Promise<ApiResponse<ActiveEmployee[]>> => {
    const qs = new URLSearchParams();
    if (params?.search) qs.set("search", params.search);
    const res = await axiosClient.get(`/tasks/admin/departments/${departmentId}/employees?${qs.toString()}`);
    return res.data;
  },

  deleteTask: async (taskId: string): Promise<ApiResponse<null>> => {
    const res = await axiosClient.delete(`/tasks/admin/${taskId}`);
    return res.data;
  },

  createTask: async (formData: FormData): Promise<ApiResponse<AdminTask>> => {
    const res = await axiosClient.post(`/tasks/admin/create`, formData, {
      headers: { "Content-Type": "multipart/form-data" },
    });
    return res.data;
  },

  uploadTaskDocuments: async (taskId: string, files: File[]): Promise<ApiResponse<any[]>> => {
    const fd = new FormData();
    files.forEach((f) => fd.append("files", f));
    const res = await axiosClient.post(`/tasks/admin/${taskId}/documents`, fd, {
      headers: { "Content-Type": "multipart/form-data" },
    });
    return res.data;
  },

  deleteTaskDocument: async (taskId: string, documentId: string): Promise<ApiResponse<any[]>> => {
    const res = await axiosClient.delete(`/tasks/admin/${taskId}/documents/${documentId}`);
    return res.data;
  },

  getTaskStats: async (): Promise<ApiResponse<{ pending: number; completed: number; rejected: number }>> => {
    const res = await axiosClient.get(`/tasks/admin/stats`);
    return res.data;
  },
};
