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

import collections


class Dependency(object):
  """Represents a dependency in Chrome, like blink, v8, pdfium, etc."""

  def __init__(self,
               path,
               repo_url,
               revision,
               deps_file='DEPS',
               deps_repo_url=None,
               deps_repo_revision=None):
    self.path = path
    self.repo_url = repo_url
    self.revision = revision
    self.deps_file = deps_file

    if deps_repo_url is None:
      self.deps_repo_url = repo_url
    else:
      self.deps_repo_url = deps_repo_url

    if deps_repo_revision is None:
      self.deps_repo_revision = revision
    else:
      self.deps_repo_revision = deps_repo_revision

    self.parent = None
    self.children = dict()

  def SetParent(self, parent):
    assert self.parent is None
    self.parent = parent
    self.parent.AddChild(self)

  def AddChild(self, child):
    self.children[child.path] = child

  def ToDict(self):
    children_dict = {}
    for path, child in self.children.iteritems():
      children_dict[path] = child.ToDict()
    return {
        'path': self.path,
        'repo_url': self.repo_url,
        'revision': self.revision,
        'deps_file': self.deps_file,
        'children': children_dict,
    }


class DependencyRoll(
    collections.namedtuple('DependencyRoll', ('path', 'repo_url',
                                              'old_revision', 'new_revision'))):
  """Represents a dependency roll (revision update) in chromium.

  Note: It is possible that the DEPS roll is a revert so that ``new_revision``
  is actually older than ``old_revision`` in the dependency.
  """

  def ToDict(self):
    return self._asdict()
