module Geoblacklight
  # Extends Blacklight::Solr::Document for GeoBlacklight specific functionalit
  module SolrDocument
    extend Blacklight::Solr::Document

    include Geoblacklight::SolrDocument::Finder
    include Geoblacklight::SolrDocument::Carto
    include Geoblacklight::SolrDocument::Inspection

    delegate :download_types, to: :references
    delegate :viewer_protocol, to: :item_viewer
    delegate :viewer_endpoint, to: :item_viewer

    def available?
      public? || same_institution?
    end

    def public?
      fetch(Settings.FIELDS.RIGHTS).casecmp('public').zero?
    end

    def restricted?
      fetch(Settings.FIELDS.RIGHTS).casecmp('restricted').zero?
    end

    def downloadable?
      (direct_download || download_types.present? || iiif_download) && available?
    end

    def references
      References.new(self)
    end

    def direct_download
      references.download.to_hash unless references.download.blank?
    end

    def hgl_download
      references.hgl.to_hash unless references.hgl.blank?
    end

    def same_institution?
      fetch(Settings.FIELDS.PROVENANCE).casecmp(Settings.INSTITUTION.downcase).zero?
    end

    def iiif_download
      references.iiif.to_hash unless references.iiif.blank?
    end

    def data_dictionary_download
      references.data_dictionary.to_hash unless references.data_dictionary.blank?
    end

    def item_viewer
      ItemViewer.new(references)
    end

    def itemtype
      'http://schema.org/Dataset'
    end

    def bounding_box_as_wsen
      geom_field = fetch(Settings.FIELDS.GEOMETRY)
      exp = /^\s*ENVELOPE\(
                  \s*([-\.\d]+)\s*,
                  \s*([-\.\d]+)\s*,
                  \s*([-\.\d]+)\s*,
                  \s*([-\.\d]+)\s*
                  \)\s*$/x # uses 'x' option for free-spacing mode
      bbox_match = exp.match(geom_field)
      return s unless bbox_match # return as-is, not a WKT
      w, e, n, s = bbox_match.captures
      "#{w} #{s} #{e} #{n}"
    end

    def wxs_identifier
      fetch(Settings.FIELDS.WXS_IDENTIFIER)
    end

    def file_format
      fetch(Settings.FIELDS.FILE_FORMAT)
    end

    ##
    # Provides a convenience method to access a SolrDocument's References
    # endpoint url without having to check and see if it is available
    # :type => a string which if its a Geoblacklight::Constants::URI key
    #          will return a coresponding Geoblacklight::Reference
    def checked_endpoint(type)
      type = references.send(type)
      type.endpoint if type.present?
    end

    private

    def method_missing(method, *args, &block)
      if /.*_url$/ =~ method.to_s
        checked_endpoint(method.to_s.gsub('_url', ''))
      else
        super
      end
    end
  end
end