#!/usr/bin/env python3.4
#
# Copyright (C) 2017 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.
#

# This script generates vhal_consts_x_y.py files for use in vhal_emulator
# They are generated from corresponding data in Vehicle HAL types.hal files
# To run, invoke at a shell by saying:
# $ packages/services/Car/tools/emulator/vhal_const_generate.py
# The script will automatically locate itself and the required HAL files and will write next
# to itself vhal_consts_x.y.py for any version of Vehicle HAL that it knows about
# Those files can then be used with vhal_emulator.py as per that script's documentation

from __future__ import print_function

import datetime

def printHeader(dest):
    year = datetime.datetime.now().year
    print("# Copyright (C) %s The Android Open Source Project" % year, file=dest)
    print("#", file=dest)
    print("# Licensed under the Apache License, Version 2.0 (the \"License\");", file=dest)
    print("# you may not use this file except in compliance with the License.", file=dest)
    print("# You may obtain a copy of the License at", file=dest)
    print("#", file=dest)
    print("#      http://www.apache.org/licenses/LICENSE-2.0", file=dest)
    print("#", file=dest)
    print("# Unless required by applicable law or agreed to in writing, software", file=dest)
    print("# distributed under the License is distributed on an \"AS IS\" BASIS,", file=dest)
    print("# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.", file=dest)
    print("# See the License for the specific language governing permissions and", file=dest)
    print("# limitations under the License.", file=dest)
    print("#", file=dest)
    print("# DO NOT EDIT MANUALLY", file=dest)
    print("# This file was autogenerated by vhal_const_generate.py", file=dest)

def printEnum(doc, name, dest, postprocess=lambda x: x):
    # Construct a value name prefix from the group name
    valueNamePrefix = name.upper() + '_'

    enum_object = doc['enums'][name]
    print("\n# %s" % name, file=dest)
    for case in enum_object.cases:
        print('%s%s = %s' % (valueNamePrefix, case.name,
            postprocess(case.value.resolve(enum_object, doc))),
            file=dest)

import os, os.path
import sys

script_directory = os.path.join(os.path.dirname(os.path.abspath(__file__)))
parent_location = os.path.abspath(os.path.join(script_directory, '..'))
sys.path.append(parent_location)

# hidl_parser depends on a custom Python package that requires installation
# give user guidance should the import fail
try:
    from hidl_parser import parser
except ImportError as e:
    isPly = False
    pipTool = "pip%s" % ("3" if sys.version_info > (3,0) else "")
    if hasattr(e, 'name'):
        if e.name == 'ply': isPly = True
    elif hasattr(e, 'message'):
        if e.message.endswith('ply'): isPly = True
    if isPly:
        print('could not import ply.')
        print('ply is available as part of an Android checkout in external/ply')
        print('or it can be installed via "sudo %s install ply"' % pipTool)
        sys.exit(1)
    else:
        raise e

android_build_top = os.environ.get("ANDROID_BUILD_TOP", None)
if android_build_top is not None:
    vhal_location = os.path.join(android_build_top, 'hardware','interfaces','automotive','vehicle')
else:
    vhal_location = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
        '..','..','..','..','..','hardware','interfaces','automotive','vehicle'
    ))
if not(os.path.exists(vhal_location) and os.path.isdir(vhal_location)):
    print("Vehicle HAL was not found at %s. lunch may provide a correct environment, or files moved" % vhal_location)
    sys.exit(1)

vhal_20_file = os.path.join(vhal_location, '2.0', 'types.hal')
vhal_21_file = os.path.join(vhal_location, '2.1', 'types.hal')

print("Generating content from Vehicle HAL 2.0 (%s) and 2.1 (%s)" % (vhal_20_file, vhal_21_file))

vhal_20_doc = parser.parse(vhal_20_file)
vhal_21_doc = parser.parse(vhal_21_file)

# Work around the fact that the parser doesn't (yet?) deal with inheritance.
# WARNING:  This pattern is rather unsafe since we're not merging the lists as we should!
# vhal_21_doc['enums']['VehiclePropertyGroup'] = vhal_20_doc['enums']['VehiclePropertyGroup']
# vhal_21_doc['enums']['VehiclePropertyType'] = vhal_20_doc['enums']['VehiclePropertyType']
# vhal_21_doc['enums']['VehicleArea'] = vhal_20_doc['enums']['VehicleArea']

def generateHal20():
    print("********************************")
    print("Generating VHal 2.0 constants...")
    vhal_20_file = open(os.path.join(script_directory, 'vhal_consts_2_0.py'), 'w')

    printHeader(vhal_20_file)

    for group in vhal_20_doc['enums']:
        print(group)
        printEnum(vhal_20_doc, group, vhal_20_file, lambda x : hex(x))

    print("\n# Create a container of value_type constants to be used by vhal_emulator", file=vhal_20_file)
    print("class vhal_types_2_0:", file=vhal_20_file)
    print("    TYPE_STRING  = [VEHICLEPROPERTYTYPE_STRING]", file=vhal_20_file)
    print("    TYPE_BYTES   = [VEHICLEPROPERTYTYPE_BYTES]", file=vhal_20_file)
    print("    TYPE_INT32   = [VEHICLEPROPERTYTYPE_BOOLEAN,", file=vhal_20_file)
    print("                    VEHICLEPROPERTYTYPE_INT32]", file=vhal_20_file)
    print("    TYPE_INT64   = [VEHICLEPROPERTYTYPE_INT64]", file=vhal_20_file)
    print("    TYPE_FLOAT   = [VEHICLEPROPERTYTYPE_FLOAT]", file=vhal_20_file)
    print("    TYPE_INT32S  = [VEHICLEPROPERTYTYPE_INT32_VEC]", file=vhal_20_file)
    print("    TYPE_FLOATS  = [VEHICLEPROPERTYTYPE_FLOAT_VEC]", file=vhal_20_file)
    print("    TYPE_COMPLEX = [VEHICLEPROPERTYTYPE_COMPLEX]", file=vhal_20_file)

def generateHal21():
    print("********************************")
    print("Generating VHal 2.1 constants...")
    vhal_21_file = open(os.path.join(script_directory, 'vhal_consts_2_1.py'), 'w')
    printHeader(vhal_21_file)
    print('from vhal_consts_2_0 import *', file=vhal_21_file)

    for group in vhal_21_doc['enums']:
        print(group)
        printEnum(vhal_21_doc, group, vhal_21_file, lambda x : hex(x))


generateHal20()
# generateHal21()
