/* global window, getStoredWorkspaceId */
const EMBEDDED_BUILDER_DRAFT_KEY = 'pluginchatbot_embedded_builder_draft';
const EMBEDDED_BUILDER_EDIT_KEY = 'pluginchatbot_embedded_builder_edit_bot_id';

function getWorkspaceScopedBuilderKey(baseKey) {
  const workspaceId = typeof getStoredWorkspaceId === 'function' ? getStoredWorkspaceId() : '';
  return workspaceId ? `${baseKey}:${workspaceId}` : baseKey;
}

const EMBEDDED_MODEL_OPTIONS = [
  'gpt-5.2',
  'gpt-5.2-pro',
  'gpt-5.1',
  'gpt-5',
  'gpt-5-mini',
  'gpt-5-nano',
  'gpt-4.1',
  'gpt-4.1-mini',
  'gpt-4.1-nano',
  'gpt-4o',
  'gpt-4o-mini',
  'o4-mini',
  'o3',
  'o3-mini',
  'o1',
];

const EMBEDDED_VOICE_OPTIONS = [
  'alloy',
  'ash',
  'ballad',
  'coral',
  'echo',
  'fable',
  'nova',
  'onyx',
  'sage',
  'shimmer',
  'verse',
  'marin',
  'cedar',
];

const DEFAULT_EMBEDDED_BUILDER_SETTINGS = {
  templateName: '',
  editingBotId: '',
  botName: 'PluginChatBot Assistant',
  avatarUrl: '',
  model: '',
  temperature: '0.7',
  rateLimit: '20',
  maxReplyTokens: '512',
  openingMessage: 'Hello! How can I help you today?',
  starters: 'What services do you offer?\nHow much does it cost?\nCan I book a demo?',
  systemInstruction: 'You are a helpful AI assistant for this website. Keep answers clear, friendly, and accurate.',
  guardrails: 'Do not answer unrelated, unsafe, or private-data requests. Ask for clarification when needed.',
  position: 'right',
  color: '#D92F24',
  colorMode: 'solid',
  gradientColor: '#D92F24',
  chatBackgroundColor: '#000000',
  enableTts: true,
  ttsModel: 'gpt-4o-mini-tts',
  voice: 'cedar',
  openaiVectorStoreId: '',
  enableFileSearch: false,
  enableCodeInterpreter: false,
  visitorCaptureEnabled: false,
  visitorCaptureMode: 'chat',
  visitorCapturePrompt: 'Good day and welcome! 👋 It’s a pleasure to have you here. To help you better, could you please share your name and email address and phone number?',
  allowedDomains: 'example.com',
};

function readBuilderStorage(storage, key, fallback) {
  try {
    const value = storage.getItem(key);
    return value ? JSON.parse(value) : fallback;
  } catch (error) {
    storage.removeItem(key);
    return fallback;
  }
}

function getEmbeddedBuilderDraft() {
  const draftKey = getWorkspaceScopedBuilderKey(EMBEDDED_BUILDER_DRAFT_KEY);
  const editKey = getWorkspaceScopedBuilderKey(EMBEDDED_BUILDER_EDIT_KEY);
  const draft = readBuilderStorage(window.localStorage, draftKey, {});
  const editingBotId = window.localStorage.getItem(editKey) || draft.editingBotId || '';

  const settings = {
    ...DEFAULT_EMBEDDED_BUILDER_SETTINGS,
    ...draft,
    editingBotId,
  };

  return normalizeEmbeddedWidgetAppearance(settings);
}

function saveEmbeddedBuilderDraft(settings, options = {}) {
  const safeSettings = getSafeEmbeddedSettings(settings);

  const draftKey = getWorkspaceScopedBuilderKey(EMBEDDED_BUILDER_DRAFT_KEY);
  const editKey = getWorkspaceScopedBuilderKey(EMBEDDED_BUILDER_EDIT_KEY);

  window.localStorage.setItem(draftKey, JSON.stringify(safeSettings));

  if (safeSettings.editingBotId) {
    window.localStorage.setItem(editKey, safeSettings.editingBotId);
  } else {
    window.localStorage.removeItem(editKey);
  }

}

function getSafeEmbeddedSettings(settings) {
  return normalizeEmbeddedWidgetAppearance(settings);
}

function normalizeEmbeddedWidgetAppearance(settings) {
  const color = /^#[0-9a-f]{6}$/i.test(String(settings.color || '').trim())
    ? settings.color
    : '#D92F24';

  const maxReplyTokens = Math.min(4096, Math.max(64, Number.parseInt(settings.maxReplyTokens, 10) || 512));

  return {
    ...settings,
    maxReplyTokens: String(maxReplyTokens),
    color,
    colorMode: 'solid',
    gradientColor: color,
    chatBackgroundColor: '#000000',
  };
}

function resetEmbeddedBuilderDraft() {
  window.localStorage.removeItem(getWorkspaceScopedBuilderKey(EMBEDDED_BUILDER_DRAFT_KEY));
  window.localStorage.removeItem(getWorkspaceScopedBuilderKey(EMBEDDED_BUILDER_EDIT_KEY));
}

function loadEmbeddedTemplateForEdit(template) {
  const settings = {
    ...DEFAULT_EMBEDDED_BUILDER_SETTINGS,
    ...(template.settings || {}),
    templateName: template.templateName || template.botName || 'Website chatbot',
    editingBotId: template.botId || '',
  };

  saveEmbeddedBuilderDraft(settings);
  return settings;
}

function getEmbeddedStarterList(starters) {
  return String(starters || '')
    .split(/\n|,/)
    .map(item => item.trim())
    .filter(Boolean)
    .slice(0, 4);
}

function getWidgetAccentBackground(settings) {
  return /^#[0-9a-f]{6}$/i.test(String(settings.color || '').trim())
    ? settings.color
    : '#D92F24';
}


function embeddedModelSupportsTemperature(model) {
  const normalized = String(model || '').trim().toLowerCase();
  return !/^(gpt-5|o1|o3|o4-mini)(?:[.-]|$)/.test(normalized);
}

function getEmbeddedPositionLabel(position) {
  return {
    right: 'Bottom Right',
    left: 'Bottom Left',
    top_right: 'Top Right',
    top_left: 'Top Left',
  }[position] || 'Bottom Right';
}

function getEmbeddedTemplateName(settings) {
  return String(settings.templateName || '').trim() || `${settings.botName || 'Website'} template`;
}

function capitalizeEmbedded(value) {
  if (!value) return '';
  return value.charAt(0).toUpperCase() + value.slice(1);
}

window.EMBEDDED_BUILDER_DRAFT_KEY = EMBEDDED_BUILDER_DRAFT_KEY;
window.EMBEDDED_BUILDER_EDIT_KEY = EMBEDDED_BUILDER_EDIT_KEY;
window.EMBEDDED_MODEL_OPTIONS = EMBEDDED_MODEL_OPTIONS;
window.EMBEDDED_VOICE_OPTIONS = EMBEDDED_VOICE_OPTIONS;
window.embeddedModelSupportsTemperature = embeddedModelSupportsTemperature;
window.DEFAULT_EMBEDDED_BUILDER_SETTINGS = DEFAULT_EMBEDDED_BUILDER_SETTINGS;
window.getEmbeddedBuilderDraft = getEmbeddedBuilderDraft;
window.saveEmbeddedBuilderDraft = saveEmbeddedBuilderDraft;
window.getSafeEmbeddedSettings = getSafeEmbeddedSettings;
window.resetEmbeddedBuilderDraft = resetEmbeddedBuilderDraft;
window.loadEmbeddedTemplateForEdit = loadEmbeddedTemplateForEdit;
window.getEmbeddedStarterList = getEmbeddedStarterList;
window.getWidgetAccentBackground = getWidgetAccentBackground;
window.getEmbeddedPositionLabel = getEmbeddedPositionLabel;
window.getEmbeddedTemplateName = getEmbeddedTemplateName;
window.capitalizeEmbedded = capitalizeEmbedded;
