import { DEFAULT_WIDGET_TEXTS, type WidgetCustomTexts } from "../lib/widget-text-defaults";
export { DEFAULT_WIDGET_TEXTS, type WidgetCustomTexts };

interface StructuredSettingsPayload {
  systemPromptText?: string;
  widgetTexts?: Partial<WidgetCustomTexts>;
}

/**
 * Extracts pure system prompt string and widget customization texts from database settings
 */
export function parseWidgetSettings(settings: any | null | undefined): {
  systemPromptText: string;
  widgetTexts: WidgetCustomTexts;
} {
  let systemPromptText = "";
  let customTexts: Partial<WidgetCustomTexts> = {};

  if (settings?.systemPrompt) {
    const raw = String(settings.systemPrompt).trim();
    if (raw.startsWith("{") && raw.endsWith("}")) {
      try {
        const parsed: StructuredSettingsPayload = JSON.parse(raw);
        if (parsed && typeof parsed === "object") {
          systemPromptText = parsed.systemPromptText || "";
          customTexts = parsed.widgetTexts || {};
        } else {
          systemPromptText = raw;
        }
      } catch (e) {
        systemPromptText = raw;
      }
    } else {
      systemPromptText = raw;
    }
  }

  // Fallback / merge priority
  const botName = settings?.botName || customTexts.botName || DEFAULT_WIDGET_TEXTS.botName;
  const headerSubtext = customTexts.headerSubtext || DEFAULT_WIDGET_TEXTS.headerSubtext;
  const headerInputPlaceholder = customTexts.headerInputPlaceholder || DEFAULT_WIDGET_TEXTS.headerInputPlaceholder;
  const startHeading = customTexts.startHeading || DEFAULT_WIDGET_TEXTS.startHeading;
  const startSubheading = customTexts.startSubheading || DEFAULT_WIDGET_TEXTS.startSubheading;
  
  let starterPrompts = DEFAULT_WIDGET_TEXTS.starterPrompts;
  if (Array.isArray(customTexts.starterPrompts) && customTexts.starterPrompts.length > 0) {
    starterPrompts = customTexts.starterPrompts.filter((p) => typeof p === "string" && p.trim().length > 0);
  }

  const disclaimerText = customTexts.disclaimerText || DEFAULT_WIDGET_TEXTS.disclaimerText;
  const disclaimerLinkText = customTexts.disclaimerLinkText || DEFAULT_WIDGET_TEXTS.disclaimerLinkText;
  const disclaimerUrl = customTexts.disclaimerUrl || DEFAULT_WIDGET_TEXTS.disclaimerUrl;
  const chatInputPlaceholder = customTexts.chatInputPlaceholder || DEFAULT_WIDGET_TEXTS.chatInputPlaceholder;
  const footerTermsText = customTexts.footerTermsText || DEFAULT_WIDGET_TEXTS.footerTermsText;
  const supportMenuItemText = customTexts.supportMenuItemText || DEFAULT_WIDGET_TEXTS.supportMenuItemText;
  const clearMenuItemText = customTexts.clearMenuItemText || DEFAULT_WIDGET_TEXTS.clearMenuItemText;
  const customerAuthEnabled = customTexts.customerAuthEnabled === true;
  const showCartSummary = customTexts.showCartSummary !== false;
  const adminDisabled = customTexts.adminDisabled === true;
  const storeSupportEmail = customTexts.storeSupportEmail || DEFAULT_WIDGET_TEXTS.storeSupportEmail || "";
  const storeSupportPhone = customTexts.storeSupportPhone || DEFAULT_WIDGET_TEXTS.storeSupportPhone || "";
  const storeSupportHours = customTexts.storeSupportHours || DEFAULT_WIDGET_TEXTS.storeSupportHours || "Mon - Fri: 9:00 AM - 6:00 PM";
  const storeAddress = customTexts.storeAddress || DEFAULT_WIDGET_TEXTS.storeAddress || "";
  const storeContactUrl = customTexts.storeContactUrl || DEFAULT_WIDGET_TEXTS.storeContactUrl || "/pages/contact";

  return {
    systemPromptText,
    widgetTexts: {
      botName,
      headerSubtext,
      headerInputPlaceholder,
      startHeading,
      startSubheading,
      starterPrompts,
      disclaimerText,
      disclaimerLinkText,
      disclaimerUrl,
      chatInputPlaceholder,
      footerTermsText,
      supportMenuItemText,
      clearMenuItemText,
      customerAuthEnabled,
      showCartSummary,
      adminDisabled,
      storeSupportEmail,
      storeSupportPhone,
      storeSupportHours,
      storeAddress,
      storeContactUrl,
    },
  };
}

/**
 * Serializes systemPrompt and widgetTexts into storage payload for ChatbotSettings
 */
export function serializeWidgetSettings(
  systemPromptText: string,
  widgetTexts: Partial<WidgetCustomTexts>
): string {
  const payload: StructuredSettingsPayload = {
    systemPromptText: (systemPromptText || "").trim(),
    widgetTexts,
  };
  return JSON.stringify(payload);
}

/**
 * Helper to update a store's chatbot admin status in ChatbotSettings.
 * When adminDisabled is true: chatbot is forced inactive and merchant cannot enable it.
 * When adminDisabled is false: merchant retains full control to toggle active/inactive.
 */
export async function setStoreChatbotAdminStatus(shopId: string, adminDisabled: boolean) {
  const prisma = (await import("../db.server")).default;
  const existing = await prisma.chatbotSettings.findUnique({ where: { shopId } });
  const { systemPromptText, widgetTexts } = parseWidgetSettings(existing);
  
  widgetTexts.adminDisabled = adminDisabled;
  const serialized = serializeWidgetSettings(systemPromptText, widgetTexts);
  
  // When SaaS Admin deactivates chatbot, immediately set enabled=false in DB
  const enabled = adminDisabled ? false : (existing?.enabled ?? true);

  return await prisma.chatbotSettings.upsert({
    where: { shopId },
    update: {
      systemPrompt: serialized,
      enabled,
    },
    create: {
      shopId,
      systemPrompt: serialized,
      enabled,
    },
  });
}

/**
 * Checks if a store's chatbot is currently locked/deactivated by SaaS Admin.
 */
export function isStoreChatbotAdminDisabled(settings: any | null | undefined): boolean {
  const { widgetTexts } = parseWidgetSettings(settings);
  return widgetTexts.adminDisabled === true;
}
