#!/usr/bin/env fuchsia-vendored-python
# 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 = {}
        self.lib_name = ""


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 []
