text: # Copyright (c) 2014-present, Facebook, Inc.
  # All rights reserved.
  #
  # This source code is licensed under the BSD-style license found in the
  # LICENSE file in the root directory of this source tree. An additional grant
  # of patent rights can be found in the PATENTS file in the same directory.
  
  from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from __future__ import unicode_literals
  import os
  
  ENUMS = {
      'Direction': [
          'Inherit',
          'LTR',
          'RTL',
      ],
      'FlexDirection': [
          'Column',
          'ColumnReverse',
          'Row',
          'RowReverse',
      ],
      'Justify': [
          'FlexStart',
          'Center',
          'FlexEnd',
          'SpaceBetween',
          'SpaceAround',
      ],
      'Overflow': [
          'Visible',
          'Hidden',
          'Scroll',
      ],
      'Align': [
          'Auto',
          'FlexStart',
          'Center',
          'FlexEnd',
          'Stretch',
      ],
      'PositionType': [
          'Relative',
          'Absolute',
      ],
      'Wrap': [
          'NoWrap',
          'Wrap',
      ],
      'MeasureMode': [
          'Undefined',
          'Exactly',
          'AtMost',
      ],
      'Dimension': [
          'Width',
          'Height',
      ],
      'Edge': [
          'Left',
          'Top',
          'Right',
          'Bottom',
          'Start',
          'End',
          'Horizontal',
          'Vertical',
          'All',
      ],
      'LogLevel': [
          'Error',
          'Warn',
          'Info',
          'Debug',
          'Verbose',
      ],
      'ExperimentalFeature': [
          'Rounding',
          # Mimic web flex-basis behavior.
          'WebFlexBasis',
      ],
      'PrintOptions': [
          ('Layout', 1),
          ('Style', 2),
          ('Children', 4),
      ],
  }
  
  LICENSE = """/**
   * Copyright (c) 2014-present, Facebook, Inc.
   * All rights reserved.
   *
   * This source code is licensed under the BSD-style license found in the
   * LICENSE file in the root directory of this source tree. An additional grant
   * of patent rights can be found in the PATENTS file in the same directory.
   */
  
  """
  
  def to_java_upper(symbol):
      symbol = str(symbol)
      out = ''
      for i in range(0, len(symbol)):
          c = symbol[i]
          if str.istitle(c) and i is not 0 and not str.istitle(symbol[i - 1]):
              out += '_'
          out += c.upper()
      return out
  
  
  root = os.path.dirname(__file__)
  
  # write out C header
  with open(root + '/yoga/YGEnums.h', 'w') as f:
      f.write(LICENSE)
      f.write('#pragma once\n\n')
      f.write('#include "YGMacros.h"\n\n')
      f.write('YG_EXTERN_C_BEGIN\n\n')
      for name, values in ENUMS.items():
          f.write('typedef enum YG%s {\n' % name)
          for value in values:
              if isinstance(value, tuple):
                  f.write('  YG%s%s = %d,\n' % (name, value[0], value[1]))
              else:
                  f.write('  YG%s%s,\n' % (name, value))
          f.write('  YG%sCount,\n' % name)
          f.write('} YG%s;\n' % name)
          f.write('\n')
      f.write('YG_EXTERN_C_END\n')
  
  # write out java files
  for name, values in ENUMS.items():
      with open(root + '/java/com/facebook/yoga/Yoga%s.java' % name, 'w') as f:
          f.write(LICENSE)
          f.write('package com.facebook.yoga;\n\n')
          f.write('import com.facebook.proguard.annotations.DoNotStrip;\n\n')
          f.write('@DoNotStrip\n')
          f.write('public enum Yoga%s {\n' % name)
          if len(values) > 0:
              for value in values:
                  if isinstance(value, tuple):
                      f.write('  %s(%d)' % (to_java_upper(value[0]), value[1]))
                  else:
                      f.write('  %s(%d)' % (to_java_upper(value), values.index(value)))
                  if values.index(value) is len(values) - 1:
                      f.write(';\n')
                  else:
                      f.write(',\n')
          else:
              f.write('__EMPTY(-1);')
          f.write('\n')
          f.write('  private int mIntValue;\n')
          f.write('\n')
          f.write('  Yoga%s(int intValue) {\n' % name)
          f.write('    mIntValue = intValue;\n')
          f.write('  }\n')
          f.write('\n')
          f.write('  public int intValue() {\n')
          f.write('    return mIntValue;\n')
          f.write('  }\n')
          f.write('\n')
          f.write('  public static Yoga%s fromInt(int value) {\n' % name)
          f.write('    switch (value) {\n')
          for value in values:
              if isinstance(value, tuple):
                  f.write('      case %d: return %s;\n' % (value[1], to_java_upper(value[0])))
              else:
                  f.write('      case %d: return %s;\n' % (values.index(value), to_java_upper(value)))
          f.write('      default: throw new IllegalArgumentException("Unkown enum value: " + value);\n')
          f.write('    }\n')
          f.write('  }\n')
          f.write('}\n')
  
  # write out csharp files
  for name, values in ENUMS.items():
      with open(root + '/csharp/Facebook.Yoga/Yoga%s.cs' % name, 'w') as f:
          f.write(LICENSE)
          f.write('namespace Facebook.Yoga\n{\n')
          f.write('    public enum Yoga%s\n    {\n' % name)
          for value in values:
              if isinstance(value, tuple):
                  f.write('        %s = %d,\n' % (value[0], value[1]))
              else:
                  f.write('        %s,\n' % value)
          f.write('    }\n')
          f.write('}\n')
  