//
// Copyright (c) 2010, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   6 May 10  Andy Frank  Creation
//

**
** JsTimeZone
**
class JsTimeZone
{
  new make(TimeZone tz)
  {
    this.tz = tz
  }

  Void write(OutStream out)
  {
    // tz,rule defined in sys.js
    out.printLine(
     """// $tz.fullName
        tz = new fan.sys.TimeZone();
        tz.m_name = "$tz.name";
        tz.m_fullName = "$tz.fullName";
        tz.m_rules = [];""")

    rules := ([Str:Obj][])tz->rules
    rules.each |r|
    {
      startYear := r["startYear"]
      offset    := r["offset"]
      stdAbbr   := r["stdAbbr"]
      dstOffset := r["dstOffset"]

      out.printLine(
       """rule = new fan.sys.TimeZone\$Rule();
           rule.startYear = $startYear;
           rule.offset = $offset;
           rule.stdAbbr = "$stdAbbr";
           rule.dstOffset = $dstOffset;""")

      if (dstOffset != 0)
      {
        dstAbbr := r["dstAbbr"]
        out.printLine(""" rule.dstAbbr = "$dstAbbr";""")
        out.print(" rule.dstStart = "); writeDstTime(r["dstStart"], out)
        out.print(" rule.dstEnd = "); writeDstTime(r["dstEnd"], out)
      }

      out.printLine(" tz.m_rules.push(rule);")
    }

    out.printLine(
     """fan.sys.TimeZone.cache["$tz.name"] = tz;
        fan.sys.TimeZone.cache["$tz.fullName"] = tz;
        fan.sys.TimeZone.names.push("$tz.name");
        fan.sys.TimeZone.fullNames.push("$tz.fullName");
        """)
  }

  private Void writeDstTime(Str:Obj map, OutStream out)
  {
    mon       := map["mon"]
    onMode    := map["onMode"]
    onWeekday := map["onWeekday"]
    onDay     := map["onDay"]
    atTime    := map["atTime"]
    atMode    := map["atMode"]
    out.printLine("new fan.sys.TimeZone\$DstTime($mon,$onMode,$onWeekday,$onDay,$atTime,$atMode)")
  }

  TimeZone tz
}