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

"""Helper functions and classes used when searching for projects."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import logging

from businesslogic import work_env
from framework import framework_helpers
from framework import paginate
from framework import permissions


DEFAULT_RESULTS_PER_PAGE = 100


class ProjectSearchPipeline(object):
  """Manage the process of project search, filter, fetch, and pagination."""

  def __init__(self, mr, services,
               default_results_per_page=DEFAULT_RESULTS_PER_PAGE):

    self.mr = mr
    self.services = services
    self.default_results_per_page = default_results_per_page
    self.pagination = None
    self.allowed_project_ids = None
    self.visible_results = None

  def SearchForIDs(self, domain=None):
    """Get project IDs the user has permission to view."""
    with work_env.WorkEnv(self.mr, self.services) as we:
      self.allowed_project_ids = we.ListProjects(domain=domain)
      logging.info('allowed_project_ids is %r', self.allowed_project_ids)

  def GetProjectsAndPaginate(self, cnxn, list_page_url):
    """Paginate the filtered list of project names and retrieve Project PBs.

    Args:
      cnxn: connection to SQL database.
      list_page_url: string page URL for prev and next links.
    """
    with self.mr.profiler.Phase('getting all projects'):
      project_dict = self.services.project.GetProjects(
          cnxn, self.allowed_project_ids)
      project_list = sorted(
          project_dict.values(),
          key=lambda p: p.project_name)
      logging.info('project_list is %r', project_list)

    url_params = [(name, self.mr.GetParam(name)) for name in
                  framework_helpers.RECOGNIZED_PARAMS]
    self.pagination = paginate.ArtifactPagination(
        project_list,
        self.mr.GetPositiveIntParam('num', self.default_results_per_page),
        self.mr.GetPositiveIntParam('start'), self.mr.project_name,
        list_page_url, url_params=url_params)
    self.visible_results = self.pagination.visible_results
