require_relative 'ifd'
require_relative 'exif_tags'

module FileData
  # Represents either the zeroth or first ifd
  class OrdinalIfd
    attr_reader :stream, :index

    include TagEnumerator

    def initialize(exif_stream, index)
      @stream = exif_stream
      @index = index
    end

    def tags
      Enumerator.new do |e|
        tags_enum.each { |tag_id| process_tag(e, tag_id) }
      end
    end

    def process_tag(enumerator, tag_id)
      if pointer_tag?(tag_id)
        process_extra_ifd(enumerator, tag_id)
      else
        yield_tag(enumerator, :Tiff, tag_id)
      end
    end

    def pointer_tag?(tag_id)
      ExifTags.tag_groups.key?(tag_id)
    end

    def process_extra_ifd(enumerator, tag_id)
      seek_ifd(stream.read_tag_value)
      tags_enum.each { |t| yield_tag(enumerator, tag_id, t) }
    end

    def yield_tag(enumerator, ifd_id, tag_id)
      enumerator.yield [index, ifd_id, tag_id]
    end

    def seek_ifd(pointer_value)
      stream.seek_exif(pointer_value)
    end

    def skip
      stream.seek(tags_size(read_num_tags), IO::SEEK_CUR)
    end
  end
end