import type { WordPressIntegration } from "@/lib/types";

export function normalizeWordPressSiteUrl(raw: string): string {
  let url = raw.trim();
  if (!url) return "";
  if (!/^https?:\/\//i.test(url)) url = `https://${url}`;
  return url.replace(/\/+$/, "");
}

export function wordPressAdminUrl(siteUrl: string): string {
  return `${normalizeWordPressSiteUrl(siteUrl)}/wp-admin`;
}

export function wordPressRestBase(siteUrl: string): string {
  return `${normalizeWordPressSiteUrl(siteUrl)}/wp-json/wp/v2`;
}

export function buildWordPressAuthHeader(username: string, applicationPassword: string): string {
  const password = applicationPassword.replace(/\s+/g, "");
  const token = Buffer.from(`${username}:${password}`).toString("base64");
  return `Basic ${token}`;
}

export interface WordPressTestResult {
  ok: boolean;
  siteName?: string;
  adminUrl?: string;
  error?: string;
}

export async function testWordPressConnection(input: {
  siteUrl: string;
  username: string;
  applicationPassword: string;
}): Promise<WordPressTestResult> {
  const siteUrl = normalizeWordPressSiteUrl(input.siteUrl);
  if (!siteUrl || !input.username.trim() || !input.applicationPassword.trim()) {
    return { ok: false, error: "Site URL, username, and application password are required." };
  }

  const auth = buildWordPressAuthHeader(input.username, input.applicationPassword);
  const endpoints = [
    `${siteUrl}/wp-json/wp/v2/users/me?context=edit`,
    `${siteUrl}/wp-json/`,
  ];

  for (const url of endpoints) {
    try {
      const res = await fetch(url, {
        headers: { Authorization: auth, Accept: "application/json" },
        cache: "no-store",
      });

      if (!res.ok) {
        if (res.status === 401 || res.status === 403) {
          return {
            ok: false,
            error:
              "Authentication failed. Check your username and application password. In WordPress go to Users → Profile → Application Passwords.",
          };
        }
        if (res.status === 404) {
          return {
            ok: false,
            error:
              "WordPress REST API not found. Confirm the site URL and that REST API is enabled (WordPress 5.6+ with permalinks enabled).",
          };
        }
        continue;
      }

      const data = (await res.json()) as { name?: string; description?: string; namespaces?: string[] };
      const siteName = data.name ?? data.description ?? new URL(siteUrl).hostname;

      return {
        ok: true,
        siteName,
        adminUrl: wordPressAdminUrl(siteUrl),
      };
    } catch {
      continue;
    }
  }

  return {
    ok: false,
    error:
      "Could not reach WordPress. Check the site URL uses HTTPS, the site is online, and Application Passwords are enabled.",
  };
}

export function createWordPressIntegration(
  input: { siteUrl: string; username: string; applicationPassword: string },
  test: WordPressTestResult,
): WordPressIntegration {
  const siteUrl = normalizeWordPressSiteUrl(input.siteUrl);
  const now = new Date().toISOString();
  return {
    siteUrl,
    username: input.username.trim(),
    applicationPassword: input.applicationPassword.replace(/\s+/g, ""),
    status: test.ok ? "connected" : "error",
    connectedAt: test.ok ? now : undefined,
    lastTestedAt: now,
    lastError: test.error,
    siteName: test.siteName,
    adminUrl: test.adminUrl ?? wordPressAdminUrl(siteUrl),
  };
}

export function maskWordPressPassword(password: string): string {
  if (password.length <= 4) return "••••";
  return `${"•".repeat(Math.min(password.length - 4, 12))}${password.slice(-4)}`;
}

export function isWordPressConnected(integration?: WordPressIntegration): boolean {
  return integration?.status === "connected" && Boolean(integration.siteUrl && integration.username);
}
