module Bioshogi
  module Container
    class CheckmateYomiage
      attr_accessor :container
      attr_accessor :options

      SYMBOL_TO_SLEEP_ARGUMENT = {
        :sep1 => 0.5,
        :sep2 => 1.0,
      }

      def initialize(container, options = {})
        @container = container
        @options = options
      end

      # 以前の方法
      def to_s
        av = []
        av.concat(soldiers)
        av.push(piece_box)
        av = av.flatten
        av = av.find_all { |e| e.kind_of?(String) }
        av = av.join("。")
        av
      end

      # 新しい方法
      def to_a
        av = []
        av.concat(soldiers)
        av.push(piece_box)
        av = av.flatten
        if av.last.kind_of?(Symbol)
          av.pop
        end
        av = av.collect do |e|
          if e.kind_of?(String)
            { command: "talk", message: e }
          else
            { command: "interval", sleep: SYMBOL_TO_SLEEP_ARGUMENT.fetch(e), sleep_key: e }
          end
        end
        av
      end

      private

      def soldiers
        soldiers = container.board.soldiers
        group = soldiers.group_by(&:location)
        group = group.transform_values do |soldiers|
          soldiers = soldiers.sort_by { |e|
            [e.place.y.to_sfen, e.place.x.to_sfen]
          } # 右上から横に走査する順
          soldiers = soldiers.collect { |e|
            [e.place.yomiage, e.yomiage].join.squish
          }
          soldiers = append_separator(soldiers, :sep2)
        end
        av = Location.collect { |e|
          [e.checkmate_yomiage, :sep1, group[e] || ["なし", :sep1]]
        }
        av = av.reverse           # 相手から読み上げるため
        # append_separator(av, :sep1)
      end

      def piece_box
        piece_box = container.player_at(:black).piece_box # 白側の持駒は無視
        piece_counts = piece_box.sort_by { |e, count| -Piece.fetch(e).basic_weight }
        av = piece_counts.collect { |e, count|
          [Piece.fetch(e).yomiage(false), :sep1] * count
        }
        av = av.presence || ["なし", :sep1]
        ["もちごま", :sep1, av]
      end

      # def array_separator(ary, separator)
      #   ary.flat_map { |e| [e, separator] }[0..-2]
      # end

      def append_separator(ary, separator)
        ary.flat_map { |e| [e, separator] }
      end
    end
  end
end