// 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.search;

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

service SearchService {
  rpc BuildSearchString(SearchNode) returns (generic.String);
  rpc SearchCards(SearchRequest) returns (SearchResponse);
  rpc SearchNotes(SearchRequest) returns (SearchResponse);
  rpc JoinSearchNodes(JoinSearchNodesRequest) returns (generic.String);
  rpc ReplaceSearchNode(ReplaceSearchNodeRequest) returns (generic.String);
  rpc FindAndReplace(FindAndReplaceRequest)
      returns (collection.OpChangesWithCount);
  rpc AllBrowserColumns(generic.Empty) returns (BrowserColumns);
  rpc BrowserRowForId(generic.Int64) returns (BrowserRow);
  rpc SetActiveBrowserColumns(generic.StringList) returns (generic.Empty);
}

// Implicitly includes any of the above methods that are not listed in the
// backend service.
service BackendSearchService {}

message SearchNode {
  message Dupe {
    int64 notetype_id = 1;
    string first_field = 2;
  }
  enum Flag {
    FLAG_NONE = 0;
    FLAG_ANY = 1;
    FLAG_RED = 2;
    FLAG_ORANGE = 3;
    FLAG_GREEN = 4;
    FLAG_BLUE = 5;
    FLAG_PINK = 6;
    FLAG_TURQUOISE = 7;
    FLAG_PURPLE = 8;
  }
  enum Rating {
    RATING_ANY = 0;
    RATING_AGAIN = 1;
    RATING_HARD = 2;
    RATING_GOOD = 3;
    RATING_EASY = 4;
    RATING_BY_RESCHEDULE = 5;
  }
  message Rated {
    uint32 days = 1;
    Rating rating = 2;
  }
  enum CardState {
    CARD_STATE_NEW = 0;
    CARD_STATE_LEARN = 1;
    CARD_STATE_REVIEW = 2;
    CARD_STATE_DUE = 3;
    CARD_STATE_SUSPENDED = 4;
    CARD_STATE_BURIED = 5;
  }
  message IdList {
    repeated int64 ids = 1;
  }
  message Group {
    enum Joiner {
      AND = 0;
      OR = 1;
    }
    repeated SearchNode nodes = 1;
    Joiner joiner = 2;
  }
  enum FieldSearchMode {
    FIELD_SEARCH_MODE_NORMAL = 0;
    FIELD_SEARCH_MODE_REGEX = 1;
    FIELD_SEARCH_MODE_NOCOMBINING = 2;
  }
  message Field {
    string field_name = 1;
    string text = 2;
    FieldSearchMode mode = 3;
  }

  oneof filter {
    Group group = 1;
    SearchNode negated = 2;
    string parsable_text = 3;
    uint32 template = 4;
    int64 nid = 5;
    Dupe dupe = 6;
    string field_name = 7;
    Rated rated = 8;
    uint32 added_in_days = 9;
    int32 due_in_days = 10;
    Flag flag = 11;
    CardState card_state = 12;
    IdList nids = 13;
    uint32 edited_in_days = 14;
    string deck = 15;
    int32 due_on_day = 16;
    string tag = 17;
    string note = 18;
    uint32 introduced_in_days = 19;
    Field field = 20;
    string literal_text = 21;
  }
}

message SearchRequest {
  string search = 1;
  SortOrder order = 2;
}

message SearchResponse {
  repeated int64 ids = 1;
}

message SortOrder {
  message Builtin {
    string column = 1;
    bool reverse = 2;
  }
  oneof value {
    generic.Empty none = 1;
    string custom = 2;
    Builtin builtin = 3;
  }
}

message JoinSearchNodesRequest {
  SearchNode.Group.Joiner joiner = 1;
  SearchNode existing_node = 2;
  SearchNode additional_node = 3;
}

message ReplaceSearchNodeRequest {
  SearchNode existing_node = 1;
  SearchNode replacement_node = 2;
}

message FindAndReplaceRequest {
  repeated int64 nids = 1;
  string search = 2;
  string replacement = 3;
  bool regex = 4;
  bool match_case = 5;
  string field_name = 6;
}

message BrowserColumns {
  enum Sorting {
    SORTING_NONE = 0;
    SORTING_ASCENDING = 1;
    SORTING_DESCENDING = 2;
  }
  enum Alignment {
    ALIGNMENT_START = 0;
    ALIGNMENT_CENTER = 1;
  }
  message Column {
    string key = 1;
    string cards_mode_label = 2;
    string notes_mode_label = 3;
    // The default sort order
    Sorting sorting_cards = 4;
    Sorting sorting_notes = 9;
    bool uses_cell_font = 5;
    Alignment alignment = 6;
    string cards_mode_tooltip = 7;
    string notes_mode_tooltip = 8;
  }
  repeated Column columns = 1;
}

message BrowserRow {
  message Cell {
    enum TextElideMode {
      ElideLeft = 0;
      ElideRight = 1;
      ElideMiddle = 2;
      ElideNone = 3;
    }

    string text = 1;
    bool is_rtl = 2;
    TextElideMode elide_mode = 3;
  }
  enum Color {
    COLOR_DEFAULT = 0;
    COLOR_MARKED = 1;
    COLOR_SUSPENDED = 2;
    COLOR_FLAG_RED = 3;
    COLOR_FLAG_ORANGE = 4;
    COLOR_FLAG_GREEN = 5;
    COLOR_FLAG_BLUE = 6;
    COLOR_FLAG_PINK = 7;
    COLOR_FLAG_TURQUOISE = 8;
    COLOR_FLAG_PURPLE = 9;
    COLOR_BURIED = 10;
  }
  repeated Cell cells = 1;
  Color color = 2;
  string font_name = 3;
  uint32 font_size = 4;
}
