// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// https://developers.google.com/protocol-buffers/docs/proto3
syntax = "proto3";

import "github.com/golang/protobuf/ptypes/timestamp/timestamp.proto";

package maintpb;

message Mutation {
  GithubIssueMutation github_issue = 1; // issue-specific changes
  GithubMutation github = 3; // labels, milestones (not issue-specific)

  GitMutation git = 2;
}

message GithubMutation {
  string owner = 1;  // "golang"
  string repo = 2;  // "go"

  // Updated labels. (All must have id set at least)
  repeated GithubLabel labels = 3;

  // Updated milestones. (All must have id set at least)
  repeated GithubMilestone milestones = 4;
}

message GithubIssueMutation {
  string owner = 1;  // "golang"
  string repo = 2;  // "go"
  int32 number = 3;  // 1, 2, 3... (not the ID)

  // not_exist is set true if the issue has been found to not exist.
  // If true, the owner/repo/number fields above must still be set.
  // If a future issue mutation for the same number arrives without
  // not_exist set, then the issue comes back to life.
  bool not_exist = 13;

  int64 id = 12;  // unique across all repos

  GithubUser user = 4;   // only set for new/updated issues, not new comments
  repeated GithubUser assignees = 10; // who the issue is assigned to
  repeated int64 deleted_assignees = 11; // IDs of users to delete from the assignee list
  google.protobuf.Timestamp created = 5; // only needed on new issues
  google.protobuf.Timestamp updated = 6; // only set on updated issue text
  string body = 7; // for new or updated issue text (top post, which isn't a comment)
  string title = 9; // issue title

  bool no_milestone = 15; // true unsets any previously-set milestone; false ignored.
  // When setting a milestone, only the milestone_id must be set.
  // TODO: allow num or title to be used if Github only returns those? So far unneeded.
  // The num and title, if non-zero, are treated as if they were a GithubMutation.Milestone update.
  int64 milestone_id = 16; // sets milestone to this milestone id (e.g. 2386495, global?)
  int64 milestone_num = 17; // sets milestone to this milestone number (e.g. 2, per-repo)
  string milestone_title = 18;

  BoolChange closed = 19;
  BoolChange locked = 25;

  google.protobuf.Timestamp closed_at = 21;
  GithubUser closed_by = 22;

  repeated int64 remove_label = 23; // label IDs to remove
  repeated GithubLabel add_label = 24;

  repeated GithubIssueCommentMutation comment = 8;
  GithubIssueSyncStatus comment_status = 14;

  repeated GithubIssueEvent event = 26;  // new events to add
  GithubIssueSyncStatus event_status = 27;
}

// BoolChange represents a change to a boolean value.
message BoolChange {
  bool val = 1;
}

message GithubLabel {
  int64 id = 1;
  string name = 2;
}

message GithubMilestone {
  int64 id = 1; // required

  // Following only need to be non-zero on changes:
  string title = 2;
  BoolChange closed = 3;
  int64 number = 4;
}

// See https://developer.github.com/v3/activity/events/types/#issuesevent
// for some info.
message GithubIssueEvent {
  // Required:
  int64 id = 1;

  // event_type can be one of "assigned", "unassigned", "labeled",
  // "unlabeled", "opened", "edited", "milestoned", "demilestoned",
  // "closed", "reopened", "referenced", "renamed" or anything else
  // that Github adds in the future.
  string event_type = 2;
  int64 actor_id = 3;
  google.protobuf.Timestamp created = 4; // time of the event

  // label is populated for "labeled" and "unlabeled" events.
  // The label will usually not have an ID, due to Github's API
  // not returning one.
  GithubLabel label = 5;

  // milestone is populated for "milestoned" and "demilestoned" events.
  // The label will usually not have an ID, due to Github's API
  // not returning one.
  GithubMilestone milestone = 6;

  // For "assigned", "unassigned":
  int64 assignee_id = 7; // always same as actor_id it seems? Github API doesn't say.
  int64 assigner_id = 8;

  // For "referenced", "closed":
  GithubCommit commit = 9;

  // For "renamed" events:
  string rename_from = 11;
  string rename_to = 12;

  // other_json is usually empty. If Github adds event types or fields
  // in the future, this captures those added fields. If non-empty it
  // will be a JSON object with the fields that weren't understood.
  bytes other_json = 10;
}

message GithubCommit {
  string owner = 1;     // "golang"
  string repo = 2;      // "go"
  string commit_id = 3; // "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
}

// GithubIssueSyncStatus notes where syncing is at for comments
// on an issue,
// This mutation type is only made at/after the same top-level mutation
// which created the corresponding comments.
message GithubIssueSyncStatus {
  // server_date is the "Date" response header from Github for the
  // final HTTP response.
  google.protobuf.Timestamp server_date = 1;
}

message GithubIssueCommentMutation {
  int64 id = 1;
  GithubUser user = 2; // not present in edits later
  string body = 3;   // may not be present in edits later (if only reactions changed? TODO: investigate)
  google.protobuf.Timestamp created = 4; // not present in edits later
  google.protobuf.Timestamp updated = 5;
}

message GithubUser {
  int64 id = 1;
  string login = 2;
}

message GitMutation {
  GitRepo repo = 1;

  // commit adds a commit, or adds new information to a commit if fields
  // are added in the future.
  GitCommit commit = 2;
}

// GitRepo identifies a git repo being mutated.
message GitRepo {
  // If go_repo is set, it identifies a go.googlesource.com/<go_repo> repo.
  string go_repo = 1;

  // TODO: code.googlesource.com and github repos later.
}

message GitCommit {
  string sha1 = 1; // the full lowercase 40-hex-byte sha1 sum

  // raw is the "git cat-file commit $sha1" output.
  bytes raw = 2;

  GitDiffTree diff_tree = 3;
}

// git diff-tree --numstat oldtree newtree
message GitDiffTree {
  repeated GitDiffTreeFile file = 1;
}

// GitDiffTreeFile represents one line of `git diff-tree --numstat` output.
message GitDiffTreeFile {
  string file = 1;
  int64  added = 2;
  int64  deleted = 3;
  bool   binary = 4;
}
