export interface SubmitFeatureFlags {
  /**
   * Properties assigned to Feature Flag data that can then be used for delete / query operations.
   *
   * Examples might be an account or user ID that can then be used to clean up data if an account is removed from the
   * Provider system.
   *
   * Note that these properties will never be returned with Feature Flag data. They are not intended for use as metadata
   * to associate with a Feature Flag. Internally they are stored as a hash so that personal information etc. is never
   * stored within Jira.
   *
   * Properties are supplied as key/value pairs, a maximum of 5 properties can be supplied, and keys must not contain
   * ':' or start with '_'.
   */
  properties?: unknown;
  /**
   * A list of Feature Flags to submit to Jira.
   *
   * Each Feature Flag may be associated with 1 or more Jira issue keys, and will be associated with any properties
   * included in this request.
   */
  flags?: {
    /**
     * The FeatureFlagData schema version used for this flag data.
     *
     * Placeholder to support potential schema changes in the future.
     */
    schemaVersion?: '1.0' | string;
    /** The identifier for the Feature Flag. Must be unique for a given Provider. */
    id: string;
    /**
     * The identifier that users would use to reference the Feature Flag in their source code etc.
     *
     * Will be made available via the UI for users to copy into their source code etc.
     */
    key: string;
    /**
     * An ID used to apply an ordering to updates for this Feature Flag in the case of out-of-order receipt of update
     * requests.
     *
     * This can be any monotonically increasing number. A suggested implementation is to use epoch millis from the
     * Provider system, but other alternatives are valid (e.g. a Provider could store a counter against each Feature
     * Flag and increment that on each update to Jira).
     *
     * Updates for a Feature Flag that are received with an updateSqeuenceId lower than what is currently stored will be
     * ignored.
     */
    updateSequenceId: number;
    /**
     * The human-readable name for the Feature Flag. Will be shown in the UI.
     *
     * If not provided, will use the ID for display.
     */
    displayName?: string;
    /** The Jira issue keys to associate the Feature Flag information with. */
    issueKeys: string[];
    /**
     * Summary information for a single Feature Flag.
     *
     * Providers may elect to provide information from a specific environment, or they may choose to 'roll up'
     * information from across multiple environments - whatever makes most sense in the Provider system.
     *
     * This is the summary information that will be presented to the user on e.g. the Jira issue screen.
     */
    summary: {
      /**
       * A URL users can use to link to a summary view of this flag, if appropriate.
       *
       * This could be any location that makes sense in the Provider system (e.g. if the summary information comes from
       * a specific environment, it might make sense to link the user to the flag in that environment).
       */
      url?: string;
      /** Status information about a single Feature Flag. */
      status: {
        /**
         * Whether the Feature Flag is enabled in the given environment (or in summary).
         *
         * Enabled may imply a partial rollout, which can be described using the 'rollout' field.
         */
        enabled: boolean;
        /**
         * The value served by this Feature Flag when it is disabled. This could be the actual value or an alias, as
         * appropriate.
         *
         * This value may be presented to the user in the UI.
         */
        defaultValue?: string;
        /**
         * Information about the rollout of a Feature Flag in an environment (or in summary).
         *
         * Only one of 'percentage', 'text', or 'rules' should be provided. They will be used in that order if multiple
         * are present.
         *
         * This information may be presented to the user in the UI.
         */
        rollout?: {
          /** If the Feature Flag rollout is a simple percentage rollout */
          percentage?: number;
          /** A text status to display that represents the rollout. This could be e.g. a named cohort. */
          text?: string;
          /** A count of the number of rules active for this Feature Flag in an environment. */
          rules?: number;
        };
      };
      /**
       * The last-updated timestamp to present to the user as a summary of the state of the Feature Flag.
       *
       * Providers may choose to supply the last-updated timestamp from a specific environment, or the 'most recent'
       * last-updated timestamp across all environments - whatever makes sense in the Provider system.
       *
       * Expected format is an RFC3339 formatted string.
       */
      lastUpdated: string;
    };
    /**
     * Detail information for this Feature Flag.
     *
     * This may be information for each environment the Feature Flag is defined in or a selection of environments made
     * by the user, as appropriate.
     */
    details: {
      /** A URL users can use to link to this Feature Flag, in this environment. */
      url: string;
      /**
       * The last-updated timestamp for this Feature Flag, in this environment.
       *
       * Expected format is an RFC3339 formatted string.
       */
      lastUpdated: string;
      /**
       * Details of a single environment.
       *
       * At the simplest this must be the name of the environment.
       *
       * Ideally there is also type information which may be used to group data from multiple Feature Flags and other
       * entities for visualisation in the UI.
       */
      environment: {
        /** The name of the environment. */
        name: string;
        /** The 'type' or 'category' of environment this environment belongs to. */
        type?: 'development' | 'testing' | 'staging' | 'production' | string;
      };
      /** Status information about a single Feature Flag. */
      status: {
        /**
         * Whether the Feature Flag is enabled in the given environment (or in summary).
         *
         * Enabled may imply a partial rollout, which can be described using the 'rollout' field.
         */
        enabled: boolean;
        /**
         * The value served by this Feature Flag when it is disabled. This could be the actual value or an alias, as
         * appropriate.
         *
         * This value may be presented to the user in the UI.
         */
        defaultValue?: string;
        /**
         * Information about the rollout of a Feature Flag in an environment (or in summary).
         *
         * Only one of 'percentage', 'text', or 'rules' should be provided. They will be used in that order if multiple
         * are present.
         *
         * This information may be presented to the user in the UI.
         */
        rollout?: {
          /** If the Feature Flag rollout is a simple percentage rollout */
          percentage?: number;
          /** A text status to display that represents the rollout. This could be e.g. a named cohort. */
          text?: string;
          /** A count of the number of rules active for this Feature Flag in an environment. */
          rules?: number;
        };
      };
    }[];
  }[];
  /**
   * Information about the provider. This is useful for auditing, logging, debugging, and other internal uses. It is not
   * considered private information. Hence, it may not contain personally identifiable information.
   */
  providerMetadata?: {
    /** An optional name of the source of the feature flags. */
    product?: string;
  };
}
