import ApiService from "./ApiService";

// Leave Request interfaces
export interface ApprovalLog {
  id?: string;
  action: "APPROVED" | "REJECTED" | "CANCELLED_AFTER_APPROVAL";
  approved_by?: {
    id: number;
    name: string;
  };
  rejected_by?: {
    id: number;
    name: string;
  } | null;
  reject_reason?: string | null;
  cancel_reason?: string | null;
  created_at: string;
}

export interface LeaveRequest {
  id: string;
  leave_type_id: string;
  sub_leave_type_id?: string;
  from_date: string;
  to_date: string;
  duration_days: number;
  reason: string;
  status: "pending" | "approved" | "rejected" | "cancelled";
  leave_day_type?: "FULL" | "FIRST_HALF" | "SECOND_HALF";
  comments?: string;
  is_cancelled_after_approval?: boolean;
  created_at?: string;
  updated_at?: string;
  approvalLogs?: ApprovalLog[];
  leaveType?: {
    name: string;
    code: string;
  };
  subLeaveType?: {
    name: string;
    code: string;
  };
  employee?: {
    id: string;
    first_name: string;
    last_name: string;
    department?: {
      id: number;
      name: string;
    };
    role?: {
      id: number;
      name: string;
    };
  };
}

export interface LeaveRequestFilters {
  search?: string;
  leave_type_id?: string;
  department_id?: string;
  employee_id?: string;
  status?: string;
  from_date?: string;
  to_date?: string;
  company_id?: string;
  column_name?: string;
  order?: "ASC" | "DESC";
  skip?: number;
  take?: number;
  page?: number;
  limit?: number;
  showAll?: boolean;
  date?: string;
  is_cancelled_after_approval?: string;
}

export interface CreateLeaveRequestData {
  leave_type_id: number;
  sub_leave_type_id?: number;
  from_date: string;
  to_date: string;
  duration_days: number;
  reason: string;
  leave_day_type: "FULL" | "FIRST_HALF" | "SECOND_HALF";
}

export interface UpdateLeaveRequestData {
  id: string;
  leave_type_id: number;
  sub_leave_type_id?: number;
  from_date: string;
  to_date: string;
  duration_days: number;
  reason: string;
  leave_day_type: "FULL" | "FIRST_HALF" | "SECOND_HALF";
}

export interface LeaveRequestListResponse {
  success: boolean;
  message?: string;
  data: {
    data: LeaveRequest[];
    count: number;
    meta?: {
      canCancelLeaveAfterApproved: boolean;
    };
  };
}

export interface LeaveRequestResponse {
  success: boolean;
  message?: string;
  data: LeaveRequest;
}

export interface DeleteLeaveRequestResponse {
  success: boolean;
  message?: string;
}

export interface StatusChangeData {
  status: "approved" | "rejected" | "cancelled";
  comments?: string;
  is_cancelled_after_approval?: boolean;
}

export interface StatusChangeResponse {
  success: boolean;
  message?: string;
  data: LeaveRequest;
}

// Create Leave Request
export async function createLeaveRequest(data: CreateLeaveRequestData) {
  return ApiService.request<LeaveRequestResponse>({
    url: "/leave-requests",
    method: "post",
    data,
  });
}

// Get Leave Requests with filters
export async function getLeaveRequests(filters?: LeaveRequestFilters) {
  const params: any = {};

  // Add all possible filters
  if (filters?.search) {
    params.search = filters.search;
  }

  if (filters?.leave_type_id && filters.leave_type_id !== "all") {
    params.leave_type_id = filters.leave_type_id;
  }

  if (filters?.department_id && filters.department_id !== "all") {
    params.department_id = filters.department_id;
  }

  if (filters?.employee_id && filters.employee_id !== "all") {
    params.employee_id = filters.employee_id;
  }

  if (filters?.status && filters.status !== "all") {
    params.status = filters.status;
  }

  if (filters?.from_date) {
    params.from_date = filters.from_date;
  }

  if (filters?.to_date) {
    params.to_date = filters.to_date;
  }

  if (filters?.company_id) {
    params.company_id = filters.company_id;
  }

  if (filters?.column_name) {
    params.column_name = filters.column_name;
  }

  if (filters?.order) {
    params.order = filters.order;
  }

  if (filters?.showAll !== undefined) {
    params.showAll = filters.showAll ? "true" : "false";
  }

  if (filters?.date) {
    params.date = filters.date;
  }

  if (
    filters?.is_cancelled_after_approval &&
    filters.is_cancelled_after_approval !== "all"
  ) {
    params.is_cancelled_after_approval = filters.is_cancelled_after_approval;
  }

  // Pagination - prefer skip/take over page/limit
  if (filters?.skip !== undefined) {
    params.skip = filters.skip;
  }

  if (filters?.take !== undefined) {
    params.take = filters.take;
  }

  // Fallback to page/limit if skip/take not provided
  if (filters?.skip === undefined && filters?.page !== undefined) {
    params.page = filters.page;
  }

  if (filters?.take === undefined && filters?.limit !== undefined) {
    params.limit = filters.limit;
  }

  // Default pagination if nothing provided
  if (!params.skip && !params.page) {
    params.page = 1;
  }

  if (!params.take && !params.limit) {
    params.limit = 10;
  }

  return ApiService.request<LeaveRequestListResponse>({
    url: "/leave-requests",
    method: "get",
    params,
  });
}

// Get My Leave Requests with filters (current user only)
export async function getMyLeaveRequests(filters?: LeaveRequestFilters) {
  const params: any = {};

  // Add all possible filters
  if (filters?.search) {
    params.search = filters.search;
  }

  if (filters?.leave_type_id && filters.leave_type_id !== "all") {
    params.leave_type_id = filters.leave_type_id;
  }

  if (filters?.status && filters.status !== "all") {
    params.status = filters.status;
  }

  if (filters?.from_date) {
    params.from_date = filters.from_date;
  }

  if (filters?.to_date) {
    params.to_date = filters.to_date;
  }

  if (filters?.column_name) {
    params.column_name = filters.column_name;
  }

  if (filters?.order) {
    params.order = filters.order;
  }

  // Pagination - prefer skip/take over page/limit
  if (filters?.skip !== undefined) {
    params.skip = filters.skip;
  }

  if (filters?.take !== undefined) {
    params.take = filters.take;
  }

  // Fallback to page/limit if skip/take not provided
  if (filters?.skip === undefined && filters?.page !== undefined) {
    params.page = filters.page;
  }

  if (filters?.take === undefined && filters?.limit !== undefined) {
    params.limit = filters.limit;
  }

  // Default pagination if nothing provided
  if (!params.skip && !params.page) {
    params.page = 1;
  }

  if (!params.take && !params.limit) {
    params.limit = 10;
  }

  return ApiService.request<LeaveRequestListResponse>({
    url: "/leave-requests/my-leave-requests",
    method: "get",
    params,
  });
}

// Get Leave Request by ID
export async function getLeaveRequestById(id: string) {
  return ApiService.request<LeaveRequestResponse>({
    url: `/leave-requests/${id}`,
    method: "get",
  });
}

// Update Leave Request
export async function updateLeaveRequest(data: UpdateLeaveRequestData) {
  const { id, ...updateData } = data;
  return ApiService.request<LeaveRequestResponse>({
    url: `/leave-requests/${id}`,
    method: "put",
    data: updateData,
  });
}

// Delete Leave Request
export async function deleteLeaveRequest(id: string) {
  return ApiService.request<DeleteLeaveRequestResponse>({
    url: `/leave-requests/${id}`,
    method: "delete",
  });
}

// Change Leave Request Status
export async function changeLeaveRequestStatus(
  id: string,
  data: StatusChangeData,
) {
  return ApiService.request<StatusChangeResponse>({
    url: `/leave-requests/status/${id}`,
    method: "put",
    data,
  });
}
