#!/usr/bin/env python2.7
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
'''A collection of storage classes to use with Mako templates.'''

ARCH_MAP = {
    'arm64': 'aarch64',
    'x64': 'x86_64',
}


class _CppLibrary(object):

    def __init__(self, name):
        self.name = name
        self.hdrs = []
        self.deps = []
        self.includes = ''


class CppSourceLibrary(_CppLibrary):

    def __init__(self, name):
        super(CppSourceLibrary, self).__init__(name)
        self.srcs = []


class CppPrebuiltSet(object):

    def __init__(self, link):
        self.link_lib = link
        self.dist_lib = ''
        self.dist_path = ''


class CppPrebuiltLibrary(_CppLibrary):

    def __init__(self, name):
        super(CppPrebuiltLibrary, self).__init__(name)
        self.prebuilt = ""
        self.is_static = False
        self.packaged_files = {}
        self.prebuilts = {}


class FidlLibrary(object):

    def __init__(self, name, library):
        self.name = name
        self.library = library
        self.srcs = []
        self.deps = []
        self.with_cc = False
        self.with_dart = False


class Arch(object):

    def __init__(self, short, long):
        self.short_name = short
        self.long_name = long


class Crosstool(object):

    def __init__(self, arches=[]):
        self.arches = []
        for arch in arches:
            if arch in ARCH_MAP:
                self.arches.append(Arch(arch, ARCH_MAP[arch]))
            else:
                print('Unknown target arch: %s' % arch)


class DartLibrary(object):

    def __init__(self, name, package):
        self.name = name
        self.package_name = package
        self.deps = []


class TestWorkspace(object):

    def __init__(self, sdk_path, with_cc, with_dart):
        self.sdk_path = sdk_path
        self.with_cc = with_cc
        self.with_dart = with_dart


class VulkanLibrary(object):

    def __init__(self):
        self.layers = []


class VulkanLayer(object):

    def __init__(self, name, config, binary, data_deps=None):
        self.name = name
        self.config = config
        self.binary = binary
        self.data_deps = data_deps if data_deps is not None else []
