class Embulk::Guess::TimeFormatGuess::GuessMatch

def array_sequence_find(array, seq)

def array_sequence_find(array, seq)
  (array.size - seq.size + 1).times {|i|
    return i if array[i, seq.size] == seq
  }
  return nil
end

def format

def format
  format = ''
  @parts.size.times do |i|
    format << @delimiters[i-1] if i != 0
    option = @part_options[i]
    case @parts[i]
    when :year
      format << '%Y'
    when :month
      case option
      when :zero
        format << '%m'
      when :blank
        #format << '%_m'  # not supported
        format << '%m'
      when :none
        #format << '%-m'  # not supported
        format << '%m'
      else
        format << '%m'
      end
    when :day
      case option
      when :zero
        format << '%d'
      when :blank
        format << '%e'
      when :none
        format << '%d'  # not supported
      else
        format << '%d'
      end
    when :hour
      case option
      when :zero
        format << '%H'
      when :blank
        format << '%k'
      when :none
        format << '%k'  # not supported
      else
        format << '%H'
      end
    when :minute
      # heading options are not supported
      format << '%M'
    when :second
      # heading options are not supported
      format << '%S'
    when :frac
      if option <= 3
        format << '%L'
      #elsif option <= 6
      #  format << '%6N'
      #elsif option <= 6
      #  format << '%6N'
      #elsif option <= 9
      #  format << '%9N'
      #elsif option <= 12
      #  format << '%12N'
      #elsif option <= 15
      #  format << '%15N'
      #elsif option <= 18
      #  format << '%18N'
      #elsif option <= 21
      #  format << '%21N'
      #elsif option <= 24
      #  format << '%24N'
      else
        format << '%N'
      end
    when :zone
      case option
      when :extended
        format << '%:z'
      else
        # :simple, :abb
        # don't use %Z even with :abb: https://github.com/jruby/jruby/issues/3702
        format << '%z'
      end
    else
      raise "Unknown part: #{@parts[i]}"
    end
  end
  return format
end

def initialize(delimiters, parts, part_options)

def initialize(delimiters, parts, part_options)
  @delimiters = delimiters
  @parts = parts
  @part_options = part_options
end

def merge!(another_in_group)

def merge!(another_in_group)
  part_options = another_in_group.part_options
  @part_options.size.times do |i|
    @part_options[i] ||= part_options[i]
    if @part_options[i] == nil
      part_options[i]
    elsif part_options[i] == nil
      @part_options[i]
    else
      [@part_options[i], part_options[i]].sort.last
    end
  end
  # if DMY matches, MDY is likely false match of DMY.
  dmy = array_sequence_find(another_in_group.parts, [:day, :month, :year])
  mdy = array_sequence_find(@parts, [:month, :day, :year])
  if mdy && dmy
    @parts[mdy, 3] = [:day, :month, :year]
  end
end

def mergeable_group

def mergeable_group
  # MDY is mergible with DMY
  if i = array_sequence_find(@parts, [:day, :month, :year])
    ps = @parts.dup
    ps[i, 3] = [:month, :day, :year]
    [@delimiters, ps]
  else
    [@delimiters, @parts]
  end
end