#
# == epcb/csv/csv-serializer
#
# Revision:: $Id$
#
require 'csv'
require 'epcb/csv/common'

#
# MonthDataをCSVに出力するSerializer。
#
class EPCB::CSV::CSVSerializer
  # コンストラクタ。
  # === ARGS
  # file:: データを出力するFileオブジェクト
  def initialize(file)
    @dest_file = file
  end

  # 引数+data_set+をコンストラクタで与えられた場所にCSVとして出力する。
  # === ARGS
  # data_set:: CSVに出力するデータ
  def serialize(data_set)
    CSV::Writer.generate(@dest_file, ?,, EPCB::CSV_LINE_SEP) do |csv|
      Log::voutln("Serializing sheet \"#{data_set.name}\"")
      # シート名を出力
      csv << [ EPCB::CSV_SHEET_PREFIX + data_set.name ]
      if data_set.master?
        serialize_master(data_set, csv)
      elsif data_set.prefs?
        serialize_prefs(data_set, csv)
      else
        serialize_data(data_set, csv)
      end
      Log::voutln("Finished to serialize sheet \"#{data_set.name}\"\n")
    end
  end

  protected
  # 引数のデータシートdata_setを出力する。
  # === ARGS
  # data_set:: CSVに出力するシートのデータ
  def serialize_data(data_set, csv)
    count = 0
    data_set.each do |data|
      Log::debugln("row[#{count}] = [#{data.to_a}]")
      # データを出力
      csv << data.to_a
      count += 1
    end
  end

  # 引数のマスタシートdata_setを出力する。
  # === ARGS
  # data_set:: CSVに出力するマスタシートのデータ
  def serialize_master(data_set, csv)
    Log::debugln("Use master = #{data_set.use.inspect}")
    columns = Array.new
    data_set.use.each do |use|
      columns << use.value
    end
    
    csv << columns
  end

  # 引数のプリファレンスシートdata_setを出力する。
  # === ARGS
  # data_set:: CSVに出力するマスタシートのデータ
  def serialize_prefs(data_set, csv)
    count = 0
    data_set.each do |name, value|
      Log::debugln("preference[#{count}] = { #{name} = #{value} }")
      # データを出力
      csv << [ name, value ]
      count += 1
    end
  end

end #EPCB::CSV::CSVSerializer#
