import { axiosClient } from "@/lib/axios";
import { ApiResponse } from "@/types/api.types";
import {
  PaginationParams,
  PaginationMeta,
  buildQueryParams,
} from "@/lib/pagination";
import {
  CreateTaskWithDocsResult,
  ServiceDetail,
  ServiceOption,
  Task,
  TaskDocument,
} from "../type/task.type";

export const taskService = {
  getAvailableServices: async (): Promise<{ data: ServiceOption[] }> => {
    const res = await axiosClient.get("/services/available");
    return { data: res.data.data };
  },

  getServiceDetail: async (
    serviceId: string,
  ): Promise<{ data: ServiceDetail }> => {
    const res = await axiosClient.get(`/services/available/${serviceId}`);
    return { data: res.data.data };
  },

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

  getTasks: async (
    params: PaginationParams & { status?: string; search?: string },
  ): Promise<{ data: Task[]; meta: PaginationMeta }> => {
    const res = await axiosClient.get(`/tasks?${buildQueryParams(params)}`);
    return { data: res.data.data, meta: res.data.meta };
  },

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

  updateTask: async (
    taskId: string,
    formData: FormData,
  ): Promise<ApiResponse<Task>> => {
    const res = await axiosClient.put(`/tasks/${taskId}`, formData, {
      headers: { "Content-Type": "multipart/form-data" },
    });
    return res.data;
  },

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

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

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

  clientDecideTask: async (
    taskId: string,
    body: { status: "APPROVED" | "REJECTED"; remarks?: string },
  ): Promise<ApiResponse<Task>> => {
    const res = await axiosClient.patch(
      `/tasks/${taskId}/client-approve`,
      body,
    );
    return res.data;
  },
};
