# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2015 The Android Open Source Project
#
# 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.
#
#-------------------------------------------------------------------------

import os
import string

from egl.common import *
from opengl.src_util import getGLRegistry
from itertools import chain

import khr_util.registry
from khr_util.format import indentLines

def toCamelCase (extName):
    return "".join([x.title() for x in extName.split("_")])

def makeStringList (name, strings):
    yield ""
    yield "static const char* s_%s[] =" % name
    yield "{"

    for entry in strings:
        yield "\t\"%s\"," % (entry)

    yield "};"

def makeFunctionList (name, iface):
    return makeStringList(name, [command.name for command in iface.commands])

def makeExtensionList (extensions):
    for name, iface in extensions:
        for line in makeFunctionList(name, iface):
            yield line

    yield ""
    yield "static const struct"
    yield "{"
    yield "\tconst char*\t\t\tname;"
    yield "\tconst int\t\t\tnumFunctions;"
    yield "\tconst char* const*\tfunctions;"
    yield "} s_extensions[] ="
    yield "{"

    entries = []
    for name, iface in extensions:
        entries.append("\t{ \"%s\",\tDE_LENGTH_OF_ARRAY(s_%s),\ts_%s\t}," % (name, name, name))

    for line in indentLines(entries):
        yield line

    yield "};"

def getExtensionList (registry, api):
    exts = []

    for extension in registry.extensions:
        if not khr_util.registry.extensionSupports(extension, api):
            continue

        spec = khr_util.registry.InterfaceSpec()
        spec.addExtension(extension, api)
        iface = khr_util.registry.createInterface(registry, spec, api)

        if len(iface.commands) == 0:
            continue

        exts.append((khr_util.registry.getExtensionName(extension),
                     iface))

    return exts

def uniqueExtensions (extensions):
    res = []
    seen = set()

    for name, iface in extensions:
        if not name in seen:
            res.append((name, iface))
            seen.add(name)

    return res

def getInterfaceExactVersion (registry, api, version):
    spec = khr_util.registry.InterfaceSpec()

    def check (v): return v == version

    for feature in registry.getFeatures(api, check):
        spec.addFeature(feature, api)

    return khr_util.registry.createInterface(registry, spec, api)

def gen ():
    eglRegistry = getEGLRegistry()
    eglCoreIface = getInterface(eglRegistry, 'egl', '1.4')
    egl15Iface = getInterfaceExactVersion(eglRegistry, 'egl', '1.5')
    eglExtensions = getExtensionList(eglRegistry, 'egl')

    glRegistry = getGLRegistry()
    gles1Extensions = getExtensionList(glRegistry, 'gles1')
    gles2Extensions = getExtensionList(glRegistry, 'gles2')
    gles10CoreIface = getInterface(glRegistry, 'gles1', '1.0')
    gles20CoreIface = getInterface(glRegistry, 'gles2', '2.0')
    gles30CoreIface = getInterfaceExactVersion(glRegistry, 'gles2', '3.0')
#    gles31CoreIface = getInterfaceExactVersion(glRegistry, 'gles2', '3.1')

    allExtensions = eglExtensions + uniqueExtensions(gles1Extensions + gles2Extensions)

    writeInlFile(os.path.normpath(os.path.join(SCRIPTS_DIR, "..", "..", "modules", "egl", "teglGetProcAddressTests.inl")),
                 chain(makeFunctionList        ("EGL14", eglCoreIface),
                       makeFunctionList        ("EGL15", egl15Iface),
                       makeFunctionList        ("GLES10", gles10CoreIface),
                       makeFunctionList        ("GLES20", gles20CoreIface),
                       makeFunctionList        ("GLES30", gles30CoreIface),
#                       makeFunctionList        ("GLES31", gles31CoreIface),
                       makeExtensionList    (allExtensions)))
