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

from recipe_engine import recipe_api


PLATFORM_TO_TRIPLE = {
  'fuchsia-amd64': 'x86_64-fuchsia',
  'fuchsia-arm64': 'aarch64-fuchsia',
  'linux-amd64': 'x86_64-linux-gnu',
  'linux-arm64': 'aarch64-linux-gnu',
  'mac-amd64': 'x86_64-apple-darwin',
  'mac-arm64': 'aarch64-apple-darwin',
}
PLATFORMS = PLATFORM_TO_TRIPLE.keys()


class Target(object):

  def __init__(self, api, os, arch):
    self.m = api
    self._os = os
    self._arch = arch

  @property
  def is_win(self):
    """Returns True iff the target platform is Windows."""
    return self.os == 'windows'

  @property
  def is_mac(self):
    """Returns True iff the target platform is macOS."""
    return self.os == 'mac'

  @property
  def is_linux(self):
    """Returns True iff the target platform is Linux."""
    return self.os == 'linux'

  @property
  def is_host(self):
    """Returns True iff the target platform is host."""
    return self == self.m.host

  @property
  def os(self):
    """Returns the target os name which will be in:
      * windows
      * mac
      * linux
    """
    return self._os

  @property
  def arch(self):
    """Returns the current CPU architecture."""
    return self._arch

  @property
  def platform(self):
    """Returns the target platform in the <os>-<arch> format."""
    return '%s-%s' % (self.os, self.arch)

  @property
  def triple(self):
    """Returns the target triple."""
    return PLATFORM_TO_TRIPLE[self.platform]

  def __str__(self):
    return self.platform

  def __eq__(self, other):
    if isinstance(other, Target):
      return self._os == other._os and self._arch == other._arch
    return False

  def __ne__(self, other):
    return not self.__eq__(other)


class TargetApi(recipe_api.RecipeApi):

  def __call__(self, platform):
    return Target(self, *platform.split('-', 2))

  @property
  def host(self):
    return Target(self, self.m.platform.name.replace('win', 'windows'), {
        'intel': {
            32: '386',
            64: 'amd64',
        },
        'arm': {
            32: 'armv6',
            64: 'arm64',
        },
    }[self.m.platform.arch][self.m.platform.bits])
