import { getSessionOptions } from "@/lib/cookies";
import { createCoreAPIClient } from "../coreClient";

const coreClient = createCoreAPIClient();

export interface AdminActivityLog {
  id: string;
  admin_email: string;
  action: string;
  method: string;
  url: string;
  status_code: number;
  payload: any;
  before_payload?: any;
  response_payload?: any;
  query_params?: any;
  origin_page?: string;
  log_category: string;
  ip_address: string;
  user_agent: string;
  performed_at: string;
}

export async function getAdminActivityLogs(
  params: {
    page?: number;
    pageSize?: number;
    admin_email?: string[];
    log_category?: string[];
    method?: string[];
    status_group?: string[];
    from_date?: string;
    to_date?: string;
    entity_id?: string;
    search?: string;
  },
  request: Request,
) {
  try {
    const queryParams = new URLSearchParams();
    if (params.page)
      queryParams.set(
        "offset",
        ((params.page - 1) * (params.pageSize || 20)).toString(),
      );
    if (params.pageSize) queryParams.set("limit", params.pageSize.toString());

    // Add array params
    const addArrayParam = (key: string, values?: string[]) => {
      values?.forEach((val) => queryParams.append(key, val));
    };

    addArrayParam("admin_email", params.admin_email);
    addArrayParam("log_category", params.log_category);
    addArrayParam("method", params.method);
    addArrayParam("status_group", params.status_group);

    if (params.from_date) queryParams.set("from_date", params.from_date);
    if (params.to_date) queryParams.set("to_date", params.to_date);
    if (params.entity_id) queryParams.set("entity_id", params.entity_id);
    if (params.search) queryParams.set("search", params.search);

    const options = getSessionOptions(request);
    const response = await coreClient<{
      items: AdminActivityLog[];
      totalCount: number;
    }>(`/v2/admin/activity-logs?${queryParams.toString()}`, {
      headers: { ...options },
    });
    return response;
  } catch (error) {
    return {
      success: false,
      message: (error as Error).message ?? "Failed fetching logs",
      data: { items: [], totalCount: 0 },
    };
  }
}

export async function writeAdminLog(log: Partial<AdminActivityLog>) {
  try {
    const response = await coreClient(`/v2/admin/activity-logs`, {
      method: "POST",
      body: JSON.stringify(log),
    });
    return response;
  } catch (error) {
    console.error("Failed to write admin log:", error);
  }
}

export async function deleteAllAdminLogs(ids?: string[]) {
  try {
    const response = await coreClient(`/v2/admin/activity-logs`, {
      method: "DELETE",
      body: ids ? JSON.stringify({ ids }) : undefined,
    });
    return response;
  } catch (error) {
    console.error("Failed to delete all admin logs:", error);
  }
}
