# Copyright (c) 2018 The Android Open Source Project
# Copyright (c) 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from .common.codegen import CodeGen, VulkanAPIWrapper
from .common.vulkantypes import \
        VulkanAPI, makeVulkanTypeSimple, iterateVulkanType

from .wrapperdefs import VulkanWrapperGenerator

from .wrapperdefs import API_PREFIX_VALIDATE
from .wrapperdefs import PARAMETERS_VALIDATE
from .wrapperdefs import VOID_TYPE
from .wrapperdefs import VALIDATE_RESULT_TYPE
from .wrapperdefs import VALIDATE_VAR_NAME
from .wrapperdefs import VALIDATE_GOOD_RESULT

from .wrapperdefs import VULKAN_STREAM_TYPE
from .wrapperdefs import VULKAN_STREAM_VAR_NAME

from .wrapperdefs import API_PREFIX_MARSHAL
from .wrapperdefs import API_PREFIX_FRONTEND

# Frontend
class VulkanFrontend(VulkanWrapperGenerator):

    def __init__(self, module, typeInfo):
        VulkanWrapperGenerator.__init__(self, module, typeInfo)

        def validateDefFunc(_codegen, _api):
            # TODO
            pass

        self.validateWrapper = \
            VulkanAPIWrapper(
                API_PREFIX_VALIDATE,
                PARAMETERS_VALIDATE,
                VOID_TYPE,
                validateDefFunc)

        def frontendDefFunc(codegen, api):
            retTypeName = api.retType.typeName

            codegen.stmt(
                "%s %s = %s" % (VALIDATE_RESULT_TYPE, VALIDATE_VAR_NAME,
                                VALIDATE_GOOD_RESULT))
            codegen.funcCall(None, API_PREFIX_VALIDATE + api.origName,
                             ["&%s" % VALIDATE_VAR_NAME] + list(
                                 map(lambda p: p.paramName, api.parameters)))

            codegen.beginIf(
                "%s != %s" % (VALIDATE_VAR_NAME, VALIDATE_GOOD_RESULT))
            if retTypeName == VALIDATE_RESULT_TYPE:
                codegen.stmt("return %s" % VALIDATE_VAR_NAME)
            elif retTypeName != "void":
                codegen.stmt("return (%s)0" % retTypeName)
            else:
                codegen.stmt("return")
            codegen.endIf()

            codegen.stmt("// VULKAN_STREAM_GET()")
            codegen.stmt("%s* %s = nullptr" % (VULKAN_STREAM_TYPE,
                                               VULKAN_STREAM_VAR_NAME))

            retLhs = None
            if retTypeName != "void":
                retLhs = retTypeName + " res"

            codegen.funcCall(retLhs, API_PREFIX_MARSHAL + api.origName,
                             [VULKAN_STREAM_VAR_NAME] + list(
                                 map(lambda p: p.paramName, api.parameters)))

            if retTypeName != "void":
                codegen.stmt("return res")

        self.frontendWrapper = \
            VulkanAPIWrapper(
                API_PREFIX_FRONTEND,
                [],
                None,
                frontendDefFunc)

    def onGenCmd(self, cmdinfo, name, alias):
        VulkanWrapperGenerator.onGenCmd(self, cmdinfo, name, alias)
        self.module.appendHeader(
            self.frontendWrapper.makeDecl(self.typeInfo, name))
        self.module.appendImpl(
            self.validateWrapper.makeDefinition(
                self.typeInfo, name, isStatic=True))
        self.module.appendImpl(
            self.frontendWrapper.makeDefinition(self.typeInfo, name))
