#!/usr/bin/env python3.8
# 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 []
