export interface KmpJsonFile {
  system: KmpJsonFileSystem;
  options: KmpJsonFileOptions;
  info?: KmpJsonFileInfo;
  files?: KmpJsonFileContentFile[];
  lexicalModels?: KmpJsonFileLexicalModel[];
  startMenu?: KmpJsonFileStartMenu;
  keyboards?: KmpJsonFileKeyboard[];
  relatedPackages?: KmpJsonRelatedPackage[];
}

export interface KmpJsonFileSystem {
  keymanDeveloperVersion: string;
  fileVersion: string;
}

export interface KmpJsonFileOptions {
  readmeFile?: string;
  graphicFile?: string;
  licenseFile?: string;
  welcomeFile?: string;
  executeProgram?: string;
  msiFilename?: string;
  msiOptions?: string;
}

export interface KmpJsonFileInfo {
  website?: KmpJsonFileInfoItem;
  version?: KmpJsonFileInfoItem;
  name?: KmpJsonFileInfoItem;
  copyright?: KmpJsonFileInfoItem;
  author?: KmpJsonFileInfoItem;
  /**
   * A Markdown description of the keyboard, intended for use in websites
   * referencing the keyboard
   */
  description?: KmpJsonFileInfoItem;
}

export interface KmpJsonFileInfoItem {
  description: string;
  url?: string;
}

export interface KmpJsonFileContentFile {
  name: string;
  description?: string;
  copyLocation?: number;
}

export interface KmpJsonFileLexicalModel {
  name: string;
  id: string;
  languages: KmpJsonFileLanguage[];
}

export interface KmpJsonFileLanguage {
  name: string;
  id: string;
}

export interface KmpJsonFileKeyboard {
  name: string;
  id: string;
  version: string;
  oskFont?: string;
  displayFont?: string;
  rtl?: boolean;
  languages?: KmpJsonFileLanguage[];
  examples?: KmpJsonFileExample[];
  /**
   * array of web font alternatives for OSK. should be same font data as oskFont
   */
  webOskFonts?: string[];
  /**
   * array of web font alternatives for display. should be same font data as displayFont
   */
  webDisplayFonts?: string[];
}

export interface KmpJsonFileStartMenu {
  folder?: string;
  addUninstallEntry?: boolean;
  items?: KmpJsonFileStartMenuItem[];
}

export interface KmpJsonFileStartMenuItem {
  name: string;
  filename: string;
  arguments?: string;
  icon?: string;
  location?: string;
}

export interface KmpJsonFileExample {
  /**
   * BCP 47 identifier for the example
   */
  id: string;
  /**
   * A space-separated list of keys.
   * - modifiers indicated with "+"
   * - spacebar is "space"
   * - plus key is "shift+=" or "plus" on US English (all other punctuation as per key cap).
   * - Hardware modifiers are: "shift", "ctrl", "alt", "left-ctrl",
   *   "right-ctrl", "left-alt", "right-alt"
   * - Key caps should generally be their character for desktop (Latin script
   *   case insensitive), or the actual key cap for touch
   * - Caps Lock should be indicated with "caps-on", "caps-off"
   *
   * e.g. "shift+a b right-alt+c space plus z z z" represents something like: "Ab{AltGr+C} +zzz"
   */
  keys: string;
  /**
   * The text that would be generated by typing those keys
   */
  text?: string;
  /**
   * A short description of what the text means or represents
   */
  note?: string;
}

export interface KmpJsonRelatedPackage {
  id: string;
  relationship: "deprecates" | "related";
}
