# Copyright (c) 2011 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.

"""UpgradeTable class is used in Portage package upgrade process."""

from __future__ import print_function

from chromite.lib import table


class UpgradeTable(table.Table):
  """Class to represent upgrade data in memory, can be written to csv."""

  # Column names.  Note that 'ARCH' is replaced with a real arch name when
  # these are accessed as attributes off an UpgradeTable object.
  COL_PACKAGE = 'Package'
  COL_SLOT = 'Slot'
  COL_OVERLAY = 'Overlay'
  COL_CURRENT_VER = 'Current ARCH Version'
  COL_STABLE_UPSTREAM_VER = 'Stable Upstream ARCH Version'
  COL_LATEST_UPSTREAM_VER = 'Latest Upstream ARCH Version'
  COL_STATE = 'State On ARCH'
  COL_DEPENDS_ON = 'Dependencies On ARCH'
  COL_USED_BY = 'Required By On ARCH'
  COL_TARGET = 'Root Target'
  COL_UPGRADED = 'Upgraded ARCH Version'

  # COL_STATE values should be one of the following:
  STATE_UNKNOWN = 'unknown'
  STATE_LOCAL_ONLY = 'local only'
  STATE_UPSTREAM_ONLY = 'upstream only'
  STATE_NEEDS_UPGRADE = 'needs upgrade'
  STATE_PATCHED = 'patched locally'
  STATE_DUPLICATED = 'duplicated locally'
  STATE_NEEDS_UPGRADE_AND_PATCHED = 'needs upgrade and patched locally'
  STATE_NEEDS_UPGRADE_AND_DUPLICATED = 'needs upgrade and duplicated locally'
  STATE_CURRENT = 'current'

  @staticmethod
  def GetColumnName(col, arch=None):
    """Translate from generic column name to specific given |arch|."""
    if arch:
      return col.replace('ARCH', arch)
    return col

  def __init__(self, arch, upgrade=False, name=None):
    self._arch = arch

    # These constants serve two roles, for csv output:
    # 1) Restrict which column names are valid.
    # 2) Specify the order of those columns.
    columns = [self.COL_PACKAGE,
               self.COL_SLOT,
               self.COL_OVERLAY,
               self.COL_CURRENT_VER,
               self.COL_STABLE_UPSTREAM_VER,
               self.COL_LATEST_UPSTREAM_VER,
               self.COL_STATE,
               self.COL_DEPENDS_ON,
               self.COL_USED_BY,
               self.COL_TARGET,
               ]

    if upgrade:
      columns.append(self.COL_UPGRADED)

    table.Table.__init__(self, columns, name=name)

  def __getattribute__(self, name):
    """When accessing self.COL_*, substitute ARCH name."""
    if name.startswith('COL_'):
      text = getattr(UpgradeTable, name)
      return UpgradeTable.GetColumnName(text, arch=self._arch)
    else:
      return object.__getattribute__(self, name)

  def GetArch(self):
    """Get the architecture associated with this UpgradeTable."""
    return self._arch
