import type { ControlType, DropdownOption, FieldColor } from '../domain/types';

export interface InsertTypedControlSpec {
  alias: string;
  color?: FieldColor;
  controlType: Exclude<ControlType, 'text'>;
  defaultChecked: boolean;
  defaultValue: string;
  options: DropdownOption[];
  placeholder: string;
  selectedIndex: number;
  tag: string;
}

export interface WriteTextDefaultSpec {
  tag: string;
  value: string;
}

export interface OnlyOfficeRange {
  GetText?: () => string;
}

export interface OnlyOfficeContentControl {
  AddElement?: (value: unknown, index: number) => unknown;
  GetAlias?: () => string;
  GetInternalId?: () => string;
  GetRange?: () => OnlyOfficeRange;
  GetTag: () => string;
  IsBlockLevel?: () => boolean;
  IsCheckBox?: () => boolean;
  IsComboBox?: () => boolean;
  IsDatePicker?: () => boolean;
  IsDropDownList?: () => boolean;
  RemoveAllElements?: () => unknown;
  SetAlias?: (value: string) => unknown;
  SetAppearance?: (value: string) => unknown;
  SetColor?: (value: unknown) => unknown;
  SetDate?: (value: Date) => unknown;
  SetLock?: (value: string) => unknown;
  SetPlaceholderText?: (value: string) => unknown;
  SetTag?: (value: string) => unknown;
}

export interface OnlyOfficeParagraph {
  AddInlineLvlSdt: (control: OnlyOfficeContentControl) => unknown;
  AddText: (value: string) => unknown;
}

export interface OnlyOfficeRun {
  AddText?: (value: string) => unknown;
}

export interface OnlyOfficeDocument {
  GetAllContentControls: () => OnlyOfficeContentControl[];
  InsertContent?: (items: unknown[], replaceSelection: boolean) => unknown;
  SetTrackRevisions?: (enabled: boolean) => unknown;
}

export interface OnlyOfficeApi {
  CreateBlockLvlSdt?: () => OnlyOfficeContentControl;
  CreateCheckBoxContentControl?: (properties: { checked: boolean; checkedSymbol: number; uncheckedSymbol: number }) => OnlyOfficeContentControl;
  CreateComboBoxContentControl?: (options: DropdownOption[], selectedIndex: number) => OnlyOfficeContentControl;
  CreateDatePickerContentControl?: (properties: { format: string; lang: string }) => OnlyOfficeContentControl;
  CreateParagraph: () => OnlyOfficeParagraph;
  CreateRGBColor?: (r: number, g: number, b: number) => unknown;
  CreateRun: () => OnlyOfficeRun;
  GetDocument: () => OnlyOfficeDocument;
}

export interface OnlyOfficeScope {
  [key: string]: unknown;
  elnTemplateInsert?: InsertTypedControlSpec;
  elnTemplateList?: Record<string, never>;
  elnTemplateReview?: Record<string, never>;
  elnTemplateTextDefault?: WriteTextDefaultSpec;
}

export interface OfficeContentControl {
  Alias?: string;
  ControlType?: ControlType;
  InternalId?: string;
  Tag?: string;
}

export type OnlyOfficeCommand = () => string;

export interface AscPlugin {
  button?: (id: number) => void;
  callCommand: (command: OnlyOfficeCommand, isClose: boolean, isCalc: boolean, callback: (result: unknown) => void) => boolean | void;
  executeCommand: (command: string, data: string) => unknown;
  executeMethod: (name: string, args: unknown[], callback: (result: unknown) => void) => boolean | void;
  info?: { options?: unknown };
  init?: () => void;
  onThemeChanged?: (theme: unknown) => void;
  onThemeChangedBase: (theme: unknown) => void;
}

export interface AscGlobal {
  plugin: AscPlugin;
  scope: OnlyOfficeScope;
}

declare global {
  const Api: OnlyOfficeApi;
  const Asc: { scope: OnlyOfficeScope };

  interface Window {
    Asc?: AscGlobal;
  }
}
