# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from recipe_engine import recipe_test_api


class GerritTestApi(recipe_test_api.RecipeTestApi):
  def get_file_content_response_data(self, content):
    """Returns a StepTestData object for get_file_content()."""
    return self.m.raw_io.stream_output_text(content)

  @staticmethod
  def gerrit_change_data(change_number=91827, patchset=1, **kwargs):
    # Exemplary change. Note: This contains only a subset of the key/value pairs
    # present in production to limit recipe simulation output.
    data = {
      "id": "fully~qualified~changeid",
      "status": "NEW",
      "created": "2017-01-30 13:11:20.000000000",
      "_number": str(change_number),
      "change_id": "Ideadbeef",
      "project": "chromium/src",
      "has_review_started": False,
      "branch": "main",
      "subject": "Change title",
      "revisions": {
        "184ebe53805e102605d11f6b143486d15c23a09c": {
          "_number": str(patchset),
          "commit": {
            "message": "Change commit message",
          },
        },
      },
    }
    data.update(kwargs)
    return data

  @staticmethod
  def _related_changes_data(**kwargs):
    data = {
      "changes": [
        {
          "project": "gerrit",
          "change_id": "Ic62ae3103fca2214904dbf2faf4c861b5f0ae9b5",
          "commit": {
            "commit": "78847477532e386f5a2185a4e8c90b2509e354e3",
            "parents": [{"commit": "bb499510bbcdbc9164d96b0dbabb4aa45f59a87e"}],
            "author": {
              "name": "Example Name",
              "email": "example@example.com",
              "date": "2014-07-12 15:04:24.000000000",
              "tz": 120,
            },
            "subject": "Remove Solr",
          },
          "_change_number": 58478,
          "_revision_number": 2,
          "_current_revision_number": 2,
          "status": "NEW",
        }
      ]
    }
    data.update(kwargs)
    return data

  def _make_gerrit_response_json(self, data):
    return self.m.json.output(data)

  def make_gerrit_create_branch_response_data(self):
    return self._make_gerrit_response_json(
      {
        "ref": "refs/heads/test",
        "revision": "76016386a0d8ecc7b6be212424978bb45959d668",
        "can_delete": True,
      }
    )

  def make_gerrit_create_tag_response_data(self):
    return self._make_gerrit_response_json(
      {
        "ref": "refs/tags/1.0",
        "revision": "67ebf73496383c6777035e374d2d664009e2aa5c",
        "can_delete": True,
      }
    )

  def make_gerrit_get_branch_response_data(self):
    return self._make_gerrit_response_json(
      {
        "ref": "refs/heads/main",
        "revision": "67ebf73496383c6777035e374d2d664009e2aa5c",
      }
    )

  def get_one_change_response_data(self, **kwargs):
    return self.get_multiple_changes_response_data(
      [self.gerrit_change_data(**kwargs)]
    )

  def get_multiple_changes_response_data(self, changes):
    return self._make_gerrit_response_json(changes)

  def update_files_response_data(self, **kwargs):
    return self._make_gerrit_response_json(self.gerrit_change_data(**kwargs))

  def get_empty_changes_response_data(self):
    return self._make_gerrit_response_json([])

  def get_move_change_response_data(self, **kwargs):
    return self._make_gerrit_response_json([self.gerrit_change_data(**kwargs)])

  def get_related_changes_response_data(self, **kwargs):
    return self._make_gerrit_response_json(self._related_changes_data(**kwargs))
