import { dashboardHeadingFromCleanTitle, isLegacyDefaultDashboardTitle as legacyTitle } from "./dashboard-title";

export const EMBED_KINDS = ["stats", "traffic", "top-pages", "referrers", "goals", "events", "dashboard"] as const;

export type EmbedKind = (typeof EMBED_KINDS)[number];

export type EmbedTheme = "light" | "dark" | "system";

export type EmbedAttributes = {
  range: "today" | "7d" | "30d";
  title: string;
  limit: number;
  theme: EmbedTheme;
};

export const EMBED_DEFAULTS: EmbedAttributes = {
  range: "7d",
  title: "",
  limit: 8,
  theme: "light",
};

export const PRIVATE_NOTE =
  "Sign in with a WordPress account that can manage CauseWise to view these analytics.";

export const EDITOR_NOTE =
  "Visitors who are not signed in, and signed-in users who cannot manage CauseWise, see a sign-in message instead of these numbers. The numbers are not saved in the page.";

export type DashboardToggles = {
  showStats: boolean;
  showTraffic: boolean;
  showPages: boolean;
  showReferrers: boolean;
  showGoals: boolean;
  showFunnels: boolean;
  showEvents: boolean;
};

export const DASHBOARD_TOGGLES: DashboardToggles = {
  showStats: true,
  showTraffic: true,
  showPages: true,
  showReferrers: true,
  showGoals: true,
  showFunnels: true,
  showEvents: true,
};

export type EmbedDefinition = {
  kind: EmbedKind;
  block: string;
  shortcode: string;
  title: string;
  description: string;
  icon: string;
  limit: boolean;
  dashboard?: boolean;
};

export const EMBEDS: EmbedDefinition[] = [
  {
    kind: "stats",
    block: "causewise/overview",
    shortcode: "causewise_stats",
    title: "Analytics Overview",
    description: "Page views, sessions, and visitors for a date range.",
    icon: "chart-bar",
    limit: false,
  },
  {
    kind: "traffic",
    block: "causewise/traffic",
    shortcode: "causewise_traffic",
    title: "Traffic Chart",
    description: "Event counts over the selected date range.",
    icon: "chart-line",
    limit: false,
  },
  {
    kind: "top-pages",
    block: "causewise/top-pages",
    shortcode: "causewise_top_pages",
    title: "Top Pages",
    description: "The most viewed paths.",
    icon: "admin-page",
    limit: true,
  },
  {
    kind: "referrers",
    block: "causewise/referrers",
    shortcode: "causewise_referrers",
    title: "Referrers",
    description: "Where visits came from.",
    icon: "admin-links",
    limit: true,
  },
  {
    kind: "goals",
    block: "causewise/goals",
    shortcode: "causewise_goals",
    title: "Goals",
    description: "Goal conversions from CauseWise.",
    icon: "yes-alt",
    limit: false,
  },
  {
    kind: "events",
    block: "causewise/recent-events",
    shortcode: "causewise_events",
    title: "Recent Events",
    description: "Recent event names, types, and paths. Event properties are not shown.",
    icon: "list-view",
    limit: true,
  },
  {
    kind: "dashboard",
    block: "causewise/dashboard",
    shortcode: "causewise_dashboard",
    title: "CauseWise Dashboard",
    description: "Overview, traffic, pages, referrers, goals, funnels, and recent events.",
    icon: "dashboard",
    limit: false,
    dashboard: true,
  },
];

export function embedDefinition(kind: string): EmbedDefinition | undefined {
  return EMBEDS.find((item) => item.kind === kind);
}

export function sanitizeEmbedKind(kind: string | undefined): EmbedKind | "" {
  const found = EMBEDS.find((item) => item.kind === kind);
  return found ? found.kind : "";
}

export function sanitizeEmbedRange(range: string | undefined): EmbedAttributes["range"] {
  if (range === "today" || range === "30d" || range === "7d") return range;
  return "7d";
}

export function sanitizeEmbedTheme(theme: string | undefined): EmbedTheme {
  if (theme === "dark" || theme === "system") return theme;
  return "light";
}

export function sanitizeEmbedLimit(limit: unknown): number {
  const value = typeof limit === "number" ? limit : Number(limit);
  if (!Number.isFinite(value) || value < 1) return EMBED_DEFAULTS.limit;
  return Math.min(20, Math.floor(value));
}

/** Dashboard width. A length is a maximum. wide and full follow the theme alignment. */
export function sanitizeEmbedWidth(value: unknown): string {
  if (typeof value === "number" && Number.isFinite(value)) {
    return sanitizeEmbedPixels(value);
  }
  const text = String(value ?? "")
    .trim()
    .toLowerCase()
    .replace(/\s+/g, "");
  if (!text || text === "container" || text === "default" || text === "content") return "";
  if (text === "wide" || text === "full") return text;
  const percent = /^(\d{1,3})%$/.exec(text);
  if (percent) {
    const number = Number(percent[1]);
    if (number >= 1 && number <= 100) return `${number}%`;
    return "";
  }
  const pixels = /^(\d{1,4})(?:px)?$/.exec(text);
  if (!pixels) return "";
  return sanitizeEmbedPixels(Number(pixels[1]));
}

function sanitizeEmbedPixels(value: number): string {
  if (!Number.isInteger(value) || value < 240 || value > 2000) return "";
  return `${value}px`;
}

export function sanitizeEmbedTitle(title: string | undefined): string {
  const text = (title ?? "").replace(/<[^>]*>/g, "").trim();
  if (!text || text.includes("cw_api_")) return "";
  return text.slice(0, 80);
}

export function isLegacyDefaultDashboardTitle(title: string | undefined): boolean {
  return legacyTitle(sanitizeEmbedTitle(title));
}

/** Blank and the old versioned label display CauseWise Analytics. Every other title is kept. */
export function dashboardHeading(title: string | undefined): string {
  return dashboardHeadingFromCleanTitle(sanitizeEmbedTitle(title));
}

/** wp-admin heading. A real site name stays. The old versioned site label does not. */
export function siteScreenHeading(name: string | undefined): string {
  return dashboardHeadingFromCleanTitle((name ?? "").trim());
}

export function sanitizeDashboardToggles(value: Partial<DashboardToggles> | undefined): DashboardToggles {
  const enabled = (flag: boolean | undefined) => flag !== false;
  return {
    showStats: enabled(value?.showStats),
    showTraffic: enabled(value?.showTraffic),
    showPages: enabled(value?.showPages),
    showReferrers: enabled(value?.showReferrers),
    showGoals: enabled(value?.showGoals),
    showFunnels: enabled(value?.showFunnels),
    showEvents: enabled(value?.showEvents),
  };
}
