#!/usr/bin/env python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

from __future__ import print_function

import json
import os
import sys
sys.path.append(os.path.dirname(__file__))

import usecounters

AUTOGENERATED_WARNING_COMMENT = "/* THIS FILE IS AUTOGENERATED BY gen-usecounters.py - DO NOT EDIT */"

def generate_list(f, counters):
    def print_optional_macro_declare(name):
        print('''
#ifndef %(name)s
#define %(name)s(interface_, name_) // nothing
#define DEFINED_%(name)s
#endif
''' % { 'name': name }, file=f)

    def print_optional_macro_undeclare(name):
        print('''
#ifdef DEFINED_%(name)s
#undef DEFINED_%(name)s
#undef %(name)s
#endif
''' % { 'name': name }, file=f)

    print(AUTOGENERATED_WARNING_COMMENT, file=f)

    print_optional_macro_declare('USE_COUNTER_DOM_METHOD')
    print_optional_macro_declare('USE_COUNTER_DOM_ATTRIBUTE')
    print_optional_macro_declare('USE_COUNTER_CSS_PROPERTY')

    for counter in counters:
        if counter['type'] == 'method':
            print('USE_COUNTER_DOM_METHOD(%s, %s)' % (counter['interface_name'], counter['method_name']), file=f)
        elif counter['type'] == 'attribute':
            print('USE_COUNTER_DOM_ATTRIBUTE(%s, %s)' % (counter['interface_name'], counter['attribute_name']), file=f)
        elif counter['type'] == 'property':
            prop = counter['property_name']
            print('USE_COUNTER_CSS_PROPERTY(%s, %s)' % (prop, prop), file=f)

    print_optional_macro_undeclare('USE_COUNTER_DOM_METHOD')
    print_optional_macro_undeclare('USE_COUNTER_DOM_ATTRIBUTE')
    print_optional_macro_undeclare('USE_COUNTER_CSS_PROPERTY')

def generate_property_map(f, counters):
    print(AUTOGENERATED_WARNING_COMMENT, file=f)
    print('''
enum {
  #define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) privatename_
  #define CSS_PROP_LIST_INCLUDE_LOGICAL
  #define CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_,     \\
                   kwtable_, stylestruct_, stylestructoffset_, animtype_) \\
    USE_COUNTER_FOR_CSS_PROPERTY_##method_ = eUseCounter_UNKNOWN,
  #include "nsCSSPropList.h"
  #undef CSS_PROP
  #undef CSS_PROP_LIST_INCLUDE_LOGICAL
  #undef CSS_PROP_PUBLIC_OR_PRIVATE
};
''', file=f)
    for counter in counters:
        if counter['type'] == 'property':
            prop = counter['property_name']
            print('#define USE_COUNTER_FOR_CSS_PROPERTY_%s eUseCounter_property_%s' % (prop, prop), file=f)

def use_counter_list(output_header, conf_filename):
    counters = usecounters.read_conf(conf_filename)
    generate_list(output_header, counters)

def property_map(output_map, conf_filename):
    counters = usecounters.read_conf(conf_filename)
    generate_property_map(output_map, counters)