import { createCoreAPIClient } from "@/lib/features/coreClient";
import type { CoreResponse } from "@/lib/features/types";

const coreClient = createCoreAPIClient();

export interface CreateCampaignPayload {
  name: string;
  title: string;
  body: string;
  image_url?: string;
  target_criteria: any;
  additional_data?: any;
  status?: string;
  scheduled_at?: string | null;
}

export async function createCampaign(payload: CreateCampaignPayload) {
  const response = await coreClient<any>(
    "/v1/admin-console/notifications/campaigns",
    {
      method: "POST",
      body: JSON.stringify(payload),
    },
  );
  return response;
}

export async function sendCampaign(id: string) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/campaigns/${id}/send`,
    {
      method: "POST",
    },
  );
  return response;
}

export async function listCampaigns(
  start: number = 0,
  limit: number = 20,
  filters?: {
    search?: string;
    status?: string;
    country?: string;
    city?: string;
    platform?: string;
    fromDate?: string;
    toDate?: string;
    sortBy?: string;
    sortOrder?: string;
  },
  headers?: HeadersInit,
) {
  let url = `/v1/admin-console/notifications/campaigns?start=${start}&limit=${limit}`;

  if (filters?.search) url += `&search=${encodeURIComponent(filters.search)}`;
  if (filters?.status) url += `&status=${encodeURIComponent(filters.status)}`;
  if (filters?.country)
    url += `&country=${encodeURIComponent(filters.country)}`;
  if (filters?.city) url += `&city=${encodeURIComponent(filters.city)}`;
  if (filters?.platform)
    url += `&platform=${encodeURIComponent(filters.platform)}`;
  if (filters?.fromDate)
    url += `&fromDate=${encodeURIComponent(filters.fromDate)}`;
  if (filters?.toDate) url += `&toDate=${encodeURIComponent(filters.toDate)}`;
  if (filters?.sortBy) url += `&sortBy=${encodeURIComponent(filters.sortBy)}`;
  if (filters?.sortOrder)
    url += `&sortOrder=${encodeURIComponent(filters.sortOrder)}`;

  const response = await coreClient<any[]>(url, {
    method: "GET",
    headers,
  });
  return response;
}

export interface CampaignAnalyticsBucket {
  date: string;
  sends: number;
  received: number;
  impressions: number;
  opens: number;
}

export interface CampaignAnalyticsSummary {
  campaignsSent: number;
  sends: number;
  received: number;
  impressions: number;
  opens: number;
}

export interface CampaignAnalytics {
  buckets: CampaignAnalyticsBucket[];
  summary: CampaignAnalyticsSummary;
}

export async function getCampaignAnalytics(params: {
  range?: "7d" | "30d" | "90d";
  fromDate?: string;
  toDate?: string;
}) {
  const qs = new URLSearchParams();
  if (params.range) qs.set("range", params.range);
  if (params.fromDate) qs.set("fromDate", params.fromDate);
  if (params.toDate) qs.set("toDate", params.toDate);
  const query = qs.toString();

  const response = await coreClient<CampaignAnalytics>(
    `/v1/admin-console/notifications/campaigns/analytics${query ? `?${query}` : ""}`,
    {
      method: "GET",
    },
  );
  return response;
}

export async function getCampaign(id: string, headers?: HeadersInit) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/campaigns/${id}`,
    {
      method: "GET",
      headers,
    },
  );
  return response;
}

export async function getTargetOptions(
  countries?: string[],
  headers?: HeadersInit,
) {
  const query =
    countries && countries.length > 0
      ? `?country=${encodeURIComponent(countries.join(","))}`
      : "";
  const url = `/v1/admin-console/notifications/options${query}`;
  const response = await coreClient<any>(url, {
    method: "GET",
    headers,
  });
  return response;
}

export async function getAudienceCount(criteria: any) {
  const response = await coreClient<{ count: number }>(
    "/v1/admin-console/notifications/audience/count",
    {
      method: "POST",
      body: JSON.stringify(criteria),
    },
  );
  return response;
}

export async function getAudienceMembers(
  criteria: any,
  limit: number = 50,
  offset: number = 0,
  search?: string,
) {
  const response = await coreClient<{ items: any[]; total: number }>(
    "/v1/admin-console/notifications/audience/members",
    {
      method: "POST",
      body: JSON.stringify({ criteria, limit, offset, search }),
    },
  );
  return response;
}

export async function sendTestCampaign(payload: {
  title: string;
  body: string;
  target_email: string;
  image_url?: string;
  name?: string;
  additional_data?: any;
}) {
  const response = await coreClient<any>(
    "/v1/admin-console/notifications/campaigns/test",
    {
      method: "POST",
      body: JSON.stringify(payload),
    },
  );
  return response;
}
export async function deleteCampaign(id: string) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/campaigns/${id}`,
    {
      method: "DELETE",
    },
  );
  return response;
}
export async function stopCampaign(id: string) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/campaigns/${id}/stop`,
    {
      method: "POST",
    },
  );
  return response;
}

export async function resumeCampaign(id: string) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/campaigns/${id}/resume`,
    {
      method: "POST",
    },
  );
  return response;
}

export async function getCampaignRecipients(
  id: string,
  start: number = 0,
  limit: number = 50,
  search?: string,
  status?: string,
  seenStatus?: string,
) {
  let url = `/v1/admin-console/notifications/campaigns/${id}/recipients?start=${start}&limit=${limit}`;
  if (search) url += `&search=${encodeURIComponent(search)}`;
  if (status) url += `&status=${encodeURIComponent(status)}`;
  if (seenStatus) url += `&seen_status=${encodeURIComponent(seenStatus)}`;

  const response = await coreClient<{ items: any[]; total: number }>(url, {
    method: "GET",
  });
  return response;
}

export async function activateCampaign(id: string) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/campaigns/${id}/activate`,
    {
      method: "POST",
    },
  );
  return response;
}

export async function listBlockedEmails(
  start: number = 0,
  limit: number = 50,
  search?: string,
) {
  let url = `/v1/admin-console/notifications/blocked-emails?start=${start}&limit=${limit}`;
  if (search) url += `&search=${encodeURIComponent(search)}`;

  const response = await coreClient<{ items: any[]; total: number }>(url, {
    method: "GET",
  });
  return response;
}

export async function createBlockedEmail(email: string) {
  const response = await coreClient<any>(
    "/v1/admin-console/notifications/blocked-emails",
    {
      method: "POST",
      body: JSON.stringify({ email }),
    },
  );
  return response;
}

export async function deleteBlockedEmail(id: string) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/blocked-emails/${id}`,
    {
      method: "DELETE",
    },
  );
  return response;
}

export async function toggleBlockedEmail(id: string, is_active: boolean) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/blocked-emails/${id}/toggle`,
    {
      method: "PATCH",
      body: JSON.stringify({ is_active }),
    },
  );
  return response;
}

// Default Emails

export async function listDefaultEmails() {
  const response = await coreClient<any[]>(
    "/v1/admin-console/notifications/default-emails",
    {
      method: "GET",
    },
  );
  return response;
}

export async function addDefaultEmail(email: string) {
  const response = await coreClient<any>(
    "/v1/admin-console/notifications/default-emails",
    {
      method: "POST",
      body: JSON.stringify({ email }),
    },
  );
  return response;
}

export async function deleteDefaultEmail(id: string) {
  const response = await coreClient<any>(
    `/v1/admin-console/notifications/default-emails/${id}`,
    {
      method: "DELETE",
    },
  );
  return response;
}
