type EditorFeatureMap = {
  imageExport?: boolean;
  advancedColors?: boolean;
  unlimitedRate?: boolean;
  newTemplateButton?: boolean;
  predefinedTemplatesButton?: boolean;
  gridNavigation?: boolean;
  editorThemes?: boolean;
};

export type PdfBuilderCompanyData = {
  name?: string;
  address?: string;
  city?: string;
  siret?: string;
  tva?: string;
  rcs?: string;
  capital?: string;
  email?: string;
  phone?: string;
  [key: string]: string | undefined;
};

export interface PdfBuilderExistingTemplate {
  id?: string | number;
  template_id?: string | number;
  template_data?: unknown;
  name?: string;
  description?: string;
  showGuides?: boolean;
  snapToGrid?: boolean;
  marginTop?: number;
  marginBottom?: number;
  marginLeft?: number;
  marginRight?: number;
  [key: string]: unknown;
}

export interface PdfBuilderData {
  nonce?: string;
  ajaxUrl?: string;
  templateId?: string | number | null;
  isEditing?: boolean;
  auto_save_interval?: number;
  existingTemplate?: PdfBuilderExistingTemplate;
  hasExistingData?: boolean;
  canvasSettings?: unknown;
  documentTypeTemplatesPremium?: unknown[];
  dynamicTextTemplatesPremium?: unknown[];
  mentionsTemplatesPremium?: unknown[];
  license?: {
    isPremium?: boolean;
  };
  features?: EditorFeatureMap;
  company?: PdfBuilderCompanyData;
  previewOrderData?: unknown;
}

export interface EditorFeatureFlags {
  isPremium: boolean;
  canUseImageExport: boolean;
  canUseAdvancedColors: boolean;
  canUseUnlimitedRate: boolean;
  canCreateNewTemplate: boolean;
  canUsePredefinedTemplates: boolean;
  canUseGridNavigation: boolean;
  canUseEditorThemes: boolean;
}

export function getPdfBuilderData(): PdfBuilderData {
  return (globalThis as { pdfBuilderData?: PdfBuilderData }).pdfBuilderData ?? {};
}

export function ensurePdfBuilderData(): PdfBuilderData {
  const globalScope = globalThis as { pdfBuilderData?: PdfBuilderData };
  if (!globalScope.pdfBuilderData) {
    globalScope.pdfBuilderData = {};
  }

  return globalScope.pdfBuilderData;
}

export function updatePdfBuilderData(
  updater: (data: PdfBuilderData) => void,
): PdfBuilderData {
  const editorData = ensurePdfBuilderData();
  updater(editorData);
  return editorData;
}

export function getEditorFeatureFlags(): EditorFeatureFlags {
  const editorData = getPdfBuilderData();
  const features = editorData.features ?? {};
  const isPremium = editorData.license?.isPremium === true;

  return {
    isPremium,
    canUseImageExport: isPremium && features.imageExport === true,
    canUseAdvancedColors: isPremium && features.advancedColors === true,
    canUseUnlimitedRate: isPremium && features.unlimitedRate === true,
    canCreateNewTemplate: isPremium && features.newTemplateButton === true,
    canUsePredefinedTemplates: isPremium && features.predefinedTemplatesButton === true,
    canUseGridNavigation: isPremium && features.gridNavigation === true,
    canUseEditorThemes: isPremium && features.editorThemes === true,
  };
}