#
# Copyright 2017 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Functionality to enumerate and represent starboard ports."""

import os
import _env
from starboard.tools import environment

# The name->platform path mapping.
_PATH_MAP = {{platforms_map}}
_PATH_MAP = {k:os.path.normpath(v) for k,v in _PATH_MAP.iteritems()}


# Cache of the name->PlatformInfo mapping.
_INFO_MAP = None


def _ConstructInfoMap():
  """Constructs mapping of platform names to PlatformInfo objects.

  Returns:
    A Mapping of name->PlatformInfo.
  """
  result = {}
  for name, path in _PATH_MAP.iteritems():
    result[name] = PlatformInfo(name, path)
  return result


def _GetInfoMap():
  """Gets mapping of platform names to PlatformInfo objects."""
  global _INFO_MAP
  if not _INFO_MAP:
    _INFO_MAP = _ConstructInfoMap()
  return _INFO_MAP


# Cache of the sorted list of all platform names.
_ALL = None


def GetAll():
  """Gets a sorted list of all valid Starboard platform names."""
  global _ALL
  if not _ALL:
    _ALL = sorted(_GetInfoMap().keys())
  return _ALL


def Get(platform_name):
  """Gets the PlatformInfo for the given platform name, or None."""
  return _GetInfoMap().get(platform_name)


def GetAllInfos():
  """Gets a sorted sequence of PlatformInfo objects for all valid platforms."""
  return (Get(p) for p in GetAll())


def IsValid(platform_name):
  """Determines whether the given platform name is valid."""
  return platform_name in _GetInfoMap()


class PlatformInfo(object):
  """Information about a specific Starboard platform."""

  def __init__(self, name, path):
    self.name = name
    self.path = path
