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

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

service StatsService {
  rpc CardStats(cards.CardId) returns (CardStatsResponse);
  rpc Graphs(GraphsRequest) returns (GraphsResponse);
  rpc GetGraphPreferences(generic.Empty) returns (GraphPreferences);
  rpc SetGraphPreferences(GraphPreferences) returns (generic.Empty);
}

message CardStatsResponse {
  message StatsRevlogEntry {
    int64 time = 1;
    RevlogEntry.ReviewKind review_kind = 2;
    uint32 button_chosen = 3;
    // seconds
    uint32 interval = 4;
    // per mill
    uint32 ease = 5;
    float taken_secs = 6;
  }
  repeated StatsRevlogEntry revlog = 1;
  int64 card_id = 2;
  int64 note_id = 3;
  string deck = 4;
  // Unix timestamps
  int64 added = 5;
  optional int64 first_review = 6;
  optional int64 latest_review = 7;
  optional int64 due_date = 8;
  optional int32 due_position = 9;
  // days
  uint32 interval = 10;
  // per mill
  uint32 ease = 11;
  uint32 reviews = 12;
  uint32 lapses = 13;
  float average_secs = 14;
  float total_secs = 15;
  string card_type = 16;
  string notetype = 17;
}

message GraphsRequest {
  string search = 1;
  uint32 days = 2;
}

message GraphsResponse {
  repeated cards.Card cards = 1;
  repeated RevlogEntry revlog = 2;
  uint32 days_elapsed = 3;
  // Based on rollover hour
  uint32 next_day_at_secs = 4;
  uint32 scheduler_version = 5;
  /// Seconds to add to UTC timestamps to get local time.
  int32 local_offset_secs = 7;
}

message GraphPreferences {
  enum Weekday {
    SUNDAY = 0;
    MONDAY = 1;
    FRIDAY = 5;
    SATURDAY = 6;
  }
  Weekday calendar_first_day_of_week = 1;
  bool card_counts_separate_inactive = 2;
  bool browser_links_supported = 3;
  bool future_due_show_backlog = 4;
}

message RevlogEntry {
  enum ReviewKind {
    LEARNING = 0;
    REVIEW = 1;
    RELEARNING = 2;
    // Recent Anki versions only use this when rescheduling disabled
    FILTERED = 3;
    MANUAL = 4;
  }
  int64 id = 1;
  int64 cid = 2;
  int32 usn = 3;
  uint32 button_chosen = 4;
  int32 interval = 5;
  int32 last_interval = 6;
  uint32 ease_factor = 7;
  uint32 taken_millis = 8;
  ReviewKind review_kind = 9;
}
