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

"""Module for obtaining Chrome OS board related info."""


import ConfigParser
import os


_BOARD_CONFIG_FILE = os.path.join(os.path.dirname(__file__),
                                  'board_config.ini')


class BoardError(BaseException):
    """Exception related to board info handling."""
    pass


class BoardInfo(object):
    """Provides reference information about known Chrome OS boards.

    The raw data is pulled from a .ini file at the current directory.

    """
    def __init__(self):
        self._board_config = None

    def initialize(self):
        """Read board config."""
        self._board_config = ConfigParser.ConfigParser()
        try:
            self._board_config.readfp(open(_BOARD_CONFIG_FILE))
        except IOError, e:
            raise BoardError('failed to load config file: %s' %
                             (_BOARD_CONFIG_FILE, e))


    def _get_attr(self, board, attr):
        """Returns an attribute for a given board.

        @param board: the name of the board (e.g. 'x86-alex')
        @param attr: specific attribute to return

        @return The value of the given attribute of the given board, in its raw
                (string) form, or None if not defined for this board.

        @raise BoardError: if board is unknown

        """
        try:
            return self._board_config.get(board, attr)
        except ConfigParser.NoSectionError, e:
            raise BoardError('board not found (%s)' % board)
        except ConfigParser.NoOptionError, e:
            return None


    def get_board_names(self):
        """Returns the list of board names."""
        return self._board_config.sections()


    def get_vendor(self, board):
        """Returns the vendor string of a given board, None if undefined.

        @raise BoardError: if board is not known
        """
        return self._get_attr(board, 'vendor')


    def get_appid(self, board):
        """Returns the appid string of a given board, None if undefined.

        @raise BoardError: if board is not known
        """
        return self._get_attr(board, 'appid')


    def get_hwid(self, board):
        """Returns the hwid string of a given board, None if undefined.

        @raise BoardError: if board is not known
        """
        return self._get_attr(board, 'hwid')


    def get_fsi_releases(self, board):
        """Returns the list of active FSI releases (string) of a given board.

        Returns None is no FSI releases were defined for this board.

        @raise BoardError: if board is not known
        """
        fsi_releases = self._get_attr(board, 'fsi_releases')
        return map(str.strip, fsi_releases.split(',')) if fsi_releases else None
