class CompanionItemDefinition {
  /** @type {string} */
  label;
  /** @type {CompanionInputField[]} */
  options;
}
class CompanionActionDefinition extends CompanionItemDefinition {
  /** 
   * @type {?function}
   * @param {CompanionActionEvent} action
   * @param {CompanionActionEventInfo} info
   * @returns {void}
   */
  callback;
  /** 
   * @type {?function}
   * @param {CompanionActionEvent} action
   * @returns {void}
   */
  subscribe;
  /** 
   * @type {?function}
   * @param {CompanionActionEvent} action
   * @returns {void}
   */
  unsubscribe;
}

class CompanionFeedbackDefinition extends CompanionItemDefinition {
  /** @type {?string} */
  description;
  /** 
   * @type {?function}
   * @param {CompanionFeedbackEvent} feedback
   * @returns {CompanionFeedbackResult}
   */
  callback;
  /** 
   * @type {?function}
   * @param {CompanionFeedbackEvent} feedback
   * @returns {void}
   */
  subscribe;
  /** 
   * @type {?function}
   * @param {CompanionFeedbackEvent} feedback
   * @returns {void}
   */
  unsubscribe;
}
/*
class CompanionActionEvent {
  id: string
  action: string
  options: { [key: string]: number | string | boolean | undefined }
}

class CompanionActionEventInfo {
  deviceId: string | undefined
  page: number
  bank: number
}

class CompanionFeedbackEvent {
  id: string
  type: string
  options: { [key: string]: number | string | boolean | undefined }
}
class CompanionFeedbackResult {
  color?: number
  bgcolor?: number
}
*/
class DropdownChoice {
  /** @type {(string|number)} */
  id
  /** @type {string} */
  label
}

class CompanionInputField {
  /** @type {string} */
  id;
  /**
    * 'text' | 'textinput' | 'dropdown' | 'colorpicker' | 'number' | 'checkbox' 
    * @type {string} 
    */
  type;  // TODO - multiselect
  /** @type {string} */
  label;
  /** @type {?string} */
  tooltip;
}
class CompanionInputFieldText extends CompanionInputField {
  /** Type = 'text' */
  type = 'text';
  /** @type {string} */
  value
}
class CompanionInputFieldColor extends CompanionInputField {
  /** Type = 'colorpicker' */
  type = 'colorpicker';
  /** @type {number} */
  default;
}
class CompanionInputFieldTextInput extends CompanionInputField {
  /** Type = 'textinput' */
  type = 'textinput';
  /** @type {?string} */
  regex;
  /** @type {?string} */
  default;
}
/*
class CompanionInputFieldDropdown extends CompanionInputField {
  type: 'dropdown'
  default: ConfigValue
  choices: DropdownChoice[]
}
class CompanionInputFieldCheckbox extends CompanionInputField {
  type: 'checkbox'
  default: boolean
}
class CompanionInputFieldNumber extends CompanionInputField {
  type: 'number'
  min: number
  max: number
  step?: number
  range?: boolean
  required?: boolean
  default: number
}

class CompanionConfigField extends CompanionInputField {
  width: number
}
export type SomeCompanionConfigField = SomeCompanionInputField & CompanionConfigField

class CompanionVariable {
  label: string
  name: string
}

class CompanionPreset {
  category: string
  label: string
  bank: {
    style: 'text'
    text: string
    size: 'auto' | '7' | '14' | '18' | '24' | '30' | '44'
    color: number
    bgcolor: number
  }
  feedbacks: Array<{
    type: string
    options: { [key: string]: number | string | boolean | undefined }
  }>
  actions: Array<{
    action: string
    options: { [key: string]: number | string | boolean | undefined }
  }>
  release_actions?: Array<{
    action: string
    options: { [key: string]: number | string | boolean | undefined }
  }>
}

class CompanionFeedbacks {
  [id: string]: CompanionFeedback | undefined
}
class CompanionActions {
  [id: string]: CompanionAction | undefined
}

export type CompanionUpgradeScript<TConfig> = (
  config: CompanionCoreInstanceconfig & TConfig,
  actions: CompanionMigrationAction[],
  release_actions: CompanionMigrationAction[],
  feedbacks: CompanionMigrationFeedback[]
) => boolean

class CompanionCoreInstanceconfig {
  instance_type: string
  label: string
  enabled: boolean
}

class CompanionMigrationAction {
  readonly id: string
  readonly instance: string
  label: string
  action: string
  options: { [key: string]: number | string | boolean | undefined }
}

class CompanionMigrationFeedback {
  readonly id: string
  readonly instance_id: string
  type: string
  options: { [key: string]: number | string | boolean | undefined }
}
*/
exports = module.exports = {
  CompanionActionDefinition,
  CompanionItemDefinition,
  CompanionFeedbackDefinition,
  CompanionInputField,
  CompanionInputFieldText,
  CompanionInputFieldColor,
  CompanionInputFieldTextInput,
  DropdownChoice
}