// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html

syntax = "proto3";

option java_multiple_files = true;

package anki.config;

import "anki/generic.proto";
import "anki/collection.proto";

service ConfigService {
  rpc GetConfigJson(generic.String) returns (generic.Json);
  rpc SetConfigJson(SetConfigJsonRequest) returns (collection.OpChanges);
  rpc SetConfigJsonNoUndo(SetConfigJsonRequest) returns (generic.Empty);
  rpc RemoveConfig(generic.String) returns (collection.OpChanges);
  rpc GetAllConfig(generic.Empty) returns (generic.Json);
  rpc GetConfigBool(GetConfigBoolRequest) returns (generic.Bool);
  rpc SetConfigBool(SetConfigBoolRequest) returns (collection.OpChanges);
  rpc GetConfigString(GetConfigStringRequest) returns (generic.String);
  rpc SetConfigString(SetConfigStringRequest) returns (collection.OpChanges);
  rpc GetPreferences(generic.Empty) returns (Preferences);
  rpc SetPreferences(Preferences) returns (collection.OpChanges);
}

message ConfigKey {
  enum Bool {
    BROWSER_TABLE_SHOW_NOTES_MODE = 0;
    PREVIEW_BOTH_SIDES = 3;
    COLLAPSE_TAGS = 4;
    COLLAPSE_NOTETYPES = 5;
    COLLAPSE_DECKS = 6;
    COLLAPSE_SAVED_SEARCHES = 7;
    COLLAPSE_TODAY = 8;
    COLLAPSE_CARD_STATE = 9;
    COLLAPSE_FLAGS = 10;
    SCHED_2021 = 11;
    ADDING_DEFAULTS_TO_CURRENT_DECK = 12;
    HIDE_AUDIO_PLAY_BUTTONS = 13;
    INTERRUPT_AUDIO_WHEN_ANSWERING = 14;
    PASTE_IMAGES_AS_PNG = 15;
    PASTE_STRIPS_FORMATTING = 16;
    NORMALIZE_NOTE_TEXT = 17;
    IGNORE_ACCENTS_IN_SEARCH = 18;
    RESTORE_POSITION_BROWSER = 19;
    RESTORE_POSITION_REVIEWER = 20;
    RESET_COUNTS_BROWSER = 21;
    RESET_COUNTS_REVIEWER = 22;
    RANDOM_ORDER_REPOSITION = 23;
    SHIFT_POSITION_OF_EXISTING_CARDS = 24;
  }
  enum String {
    SET_DUE_BROWSER = 0;
    SET_DUE_REVIEWER = 1;
    DEFAULT_SEARCH_TEXT = 2;
    CARD_STATE_CUSTOMIZER = 3;
  }
}

message GetConfigBoolRequest {
  ConfigKey.Bool key = 1;
}

message SetConfigBoolRequest {
  ConfigKey.Bool key = 1;
  bool value = 2;
  bool undoable = 3;
}

message GetConfigStringRequest {
  ConfigKey.String key = 1;
}

message SetConfigStringRequest {
  ConfigKey.String key = 1;
  string value = 2;
  bool undoable = 3;
}

message OptionalStringConfigKey {
  ConfigKey.String key = 1;
}

message SetConfigJsonRequest {
  string key = 1;
  bytes value_json = 2;
  bool undoable = 3;
}

message Preferences {
  message Scheduling {
    enum NewReviewMix {
      DISTRIBUTE = 0;
      REVIEWS_FIRST = 1;
      NEW_FIRST = 2;
    }

    // read only; 1-3
    uint32 scheduler_version = 1;

    uint32 rollover = 2;
    uint32 learn_ahead_secs = 3;
    NewReviewMix new_review_mix = 4;

    // v2 only
    bool new_timezone = 5;
    bool day_learn_first = 6;
  }
  message Reviewing {
    bool hide_audio_play_buttons = 1;
    bool interrupt_audio_when_answering = 2;
    bool show_remaining_due_counts = 3;
    bool show_intervals_on_buttons = 4;
    uint32 time_limit_secs = 5;
  }
  message Editing {
    bool adding_defaults_to_current_deck = 1;
    bool paste_images_as_png = 2;
    bool paste_strips_formatting = 3;
    string default_search_text = 4;
    bool ignore_accents_in_search = 5;
  }
  message BackupLimits {
    uint32 daily = 1;
    uint32 weekly = 2;
    uint32 monthly = 3;
    uint32 minimum_interval_mins = 4;
  }

  Scheduling scheduling = 1;
  Reviewing reviewing = 2;
  Editing editing = 3;
  BackupLimits backups = 4;
}
