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

"""Provides the web interface for adding and removing bug labels."""

import json

from dashboard import request_handler
from dashboard import xsrf
from dashboard.models import bug_label_patterns


class EditBugLabelsHandler(request_handler.RequestHandler):
  """Handles editing the info about perf sheriff rotations."""

  def get(self):
    """Renders the UI with all of the forms."""
    patterns_dict = bug_label_patterns.GetBugLabelPatterns()
    self.RenderHtml('edit_bug_labels.html', {
        'bug_labels': sorted(patterns_dict),
        'bug_labels_json': json.dumps(patterns_dict, indent=2, sort_keys=True)
    })

  @xsrf.TokenRequired
  def post(self):
    """Updates the sheriff configurations.

    Each form on the edit sheriffs page has a hidden field called action, which
    tells us which form was submitted. The other particular parameters that are
    expected depend on which form was submitted.
    """
    action = self.request.get('action')
    if action == 'add_buglabel_pattern':
      self._AddBuglabelPattern()
    if action == 'remove_buglabel_pattern':
      self._RemoveBuglabelPattern()

  def _AddBuglabelPattern(self):
    """Adds a bug label to be added to a group of tests.

    Request parameters:
      buglabel_to_add: The bug label, which is a BugLabelPattern entity name.
      pattern: A test path pattern.
    """
    label = self.request.get('buglabel_to_add')
    pattern = self.request.get('pattern')
    bug_label_patterns.AddBugLabelPattern(label, pattern)
    self.RenderHtml('result.html', {
        'headline': 'Added label %s' % label,
        'results': [{'name': 'Pattern', 'value': pattern}]
    })

  def _RemoveBuglabelPattern(self):
    """Removes a BugLabelPattern so that the label no longer applies.

    Request parameters:
      buglabel_to_remove: The bug label, which is the name of a
      BugLabelPattern entity.
    """
    label = self.request.get('buglabel_to_remove')
    bug_label_patterns.RemoveBugLabel(label)
    self.RenderHtml('result.html', {
        'headline': 'Deleted label %s' % label
    })
