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

from recipe_engine import recipe_api

import base64
import collections
import re
import json

class LuciConfigApi(recipe_api.RecipeApi):
  def __init__(self, **kwargs):
    super(LuciConfigApi, self).__init__(**kwargs)
    self.set_config('basic')

  def get_config_defaults(self):
    return {
      'BASE_URL': 'https://luci-config.appspot.com/',
    }

  def _get_headers(self):
    if not self.c.auth_token:
      return {}

    return {
      'Authorization': 'Bearer %s' % self.c.auth_token
    }

  def get_projects(self):
    """Fetch the mapping of project id to url from luci-config.

    Returns:
      A dictionary mapping project id to its luci-config project spec (among
      which there is a repo_url key).
    """
    url = self.c.base_url + '_ah/api/config/v1/projects'
    reuslt = self.m.url.get_json(url, step_name='Get luci-config projects',
        headers=self._get_headers()).output

    mapping = {}
    for project in reuslt['projects']:
      # Unicode and str-s don't mix well
      mapping[str(project['id'])] = {str(k): str(v) for k, v in project.items()}
    return mapping

  def get_ref_config(self, project, ref, config):
    """Fetch the ref config from luci-config.

    Args:
      project: The name of the project in luci-config.
      ref: git ref, e.g., 'refs/heads/master'
      config: The config to fetch from refs/heads/master of the project.

    Returns:
      The json returned from luci-config with 'content' field already base64
      decoded.
    """
    url = self.c.base_url + '/_ah/api/config/v1/config_sets/'
    url += self.m.url.quote('projects/%s/%s' % (project, ref), safe='')
    url += '/config/%s' % config

    result = self.m.url.get_json(
        url,
        step_name='Get project %r %r config %r' % (project, ref, config),
        headers=self._get_headers()).output
    result['content'] = base64.b64decode(result['content'])
    return result

  def get_project_metadata(self, project):
    mapping = self.get_projects()
    return mapping.get(project)
