# Copyright 2018 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.

import json

from dashboard.api import api_request_handler
from dashboard.models import report_template


class ReportTemplateHandler(api_request_handler.ApiRequestHandler):

  def _CheckUser(self):
    self._CheckIsInternalUser()

  def Post(self):
    template = json.loads(self.request.get('template'))
    name = self.request.get('name', None)
    owners = self.request.get('owners', None)
    if template is None or name is None or owners is None:
      raise api_request_handler.BadRequestError

    owners = owners.split(',')
    template_id = self.request.get('id', None)
    if template_id is not None:
      try:
        template_id = int(template_id)
      except ValueError:
        raise api_request_handler.BadRequestError
    try:
      report_template.PutTemplate(template_id, name, owners, template)
    except ValueError:
      raise api_request_handler.BadRequestError
    return report_template.List()
