<%

###
### $Rev$
### $Release: 0.7.2 $
### copyright(c) 2005-2010 kuwata-lab all rights reserved.
###

if @describe
   sb = []
   sb << "  --namespace=name :  prefix name of class\n"
   sb << "  --extends=name   :  parent class name\n"
   sb << "  --inplements=name:  interface name\n"
   sb << "  --constructor=false :  not print constructor\n"
   #sb << "  --ggap          :  use generation gap pattern\n"
   return sb.join
end

require 'kwalify/util/ordered-hash'

def generate_classdef(schema)
  hash = Kwalify::Util::OrderedHash.new
  #hash.instance_eval { alias []= add }
  Kwalify::Util.traverse_schema(schema) do |rulehash|
    if rulehash['class']
      arr = _generate_classdef(rulehash)
      key = rulehash['class']
      classdef = arr.join()
      #hash[key] = classdef if !hash.key?(key) || classdef != hash[key]
      hash[key] = classdef if !hash.key?(key) || classdef.length > hash[key].length
    end
  end
  sb = "<?php\n"
  sb << "\n"
  hash.each do |classname, classdef|
    sb << classdef
    sb << "\n"
  end
  sb << "?>\n"
  return sb
end

def _generate_classdef(rulehash)
  return nil unless rulehash['class']
  assert unless rulehash['mapping']
  classname = rulehash['class']
  classname = classname + '_' if @properties[:ggap]
  ns = @properties[:namespace]
  ns = ns + '_' if ns
  flag_init = @properties[:constructor] != false
  v = nil
  arr = ['']
  arr     << "/// #{rulehash['desc']}\n"
  arr     << "class #{ns}#{classname}"
  arr     << " extends #{v}"     if v = @properties[:extends]
  arr     << " implements #{v}"  if v = @properties[:implements]
  arr     << " {\n"
  arr2 = []   # assign into instance variables
  rulehash['mapping'].each do |name, map_rulehash|
    next unless name =~ /\A[a-zA-Z_][-\w]*\z/
    name2 = name.gsub(/-/, '_')
    var = "%-10s" % name2
    len = 10 - name2.length
    spc = ' ' * (len >= 0 ? len : 0)
    if map_rulehash.key?('default')
      arr << "    var $#{name2} = #{map_rulehash['default'].inspect}; // #{map_rulehash['type'] || 'str'}\n"
    else
      arr << "    var $#{name2}; #{spc}// #{map_rulehash['type'] || 'str'}\n"
    end
    if !flag_init
      # pass
    elsif map_rulehash['class']
      cname = map_rulehash['class']
      arr2 << "        $this->#{var} = is_array(@$arr['#{name}']) ? new #{cname}($arr['#{name}']) : @$arr['#{name}'];\n"
    elsif map_rulehash['sequence'] && map_rulehash['sequence'][0]['class']
      item_rulehash = map_rulehash['sequence'][0]
      cname = item_rulehash['class']
      arr2 << "        if (is_array(@$arr['#{name}']))\n"
      arr2 << "            foreach ($arr['#{name}'] as $k=>$v)\n"
      arr2 << "                $this->#{name2}[$k] = is_array($v) ? new #{cname}($v) : $v;\n"
      arr2 << "        //else\n"
      arr2 << "        //    $this->#{var} = @$arr['#{name}'];\n"
    elsif map_rulehash.key?('default')
      arr2 << "        if (array_key_exists('#{name}', $arr)) $this->#{name2} = $arr['#{name}'];\n"
    else
      arr2 << "        $this->#{var} = @$arr['#{name}'];\n"
    end
  end
  arr      << "    function __construct($arr=NULL) {\n"    if flag_init
  arr      << "        if (! $arr) return;\n"            if flag_init
  arr.concat(arr2)
  arr      << "    }\n"   if flag_init
  if @properties[:ggap]
    arr   << "}\n"
    arr   << "class #{ns}#{rulehash['class']} extends #{ns}#{classname}\n"
  end
  arr     << "}\n"
  return arr
end

%> <%= generate_classdef(@schema) %>