require "addressable/uri"

class InjectPageURLs
  class << self
    def with(new_settings = {})
      default_settings = {
        infer_host?: true,
        use_query_methods?: true
      }
      @settings = default_settings.merge(new_settings)
    end

    def inject_page_urls(uri, page)
      # order of uri setters matters here for some reason

      if @settings[:infer_host?]
        fail "You passed a hostname into #{self}#page_url,"\
          " this is done automatically!" unless uri.host.nil?
        envied_uri = Addressable::URI.heuristic_parse(host_from_namespacing(page))
        uri.host = envied_uri.host
        uri.port = envied_uri.port
        uri.scheme = envied_uri.scheme
      end

      if @settings[:use_query_methods?]
        fail "You passed a query string into #{self}#page_url,"\
          " use params[:queries] and #{self}#params= instead!" unless uri.query.nil?
        uri.query_values = query_from_params(page)
      end

      uri.to_s
    end

    private

    # rubocop:disable Metrics/MethodLength
    def host_from_namespacing(page)
      site_name = page.to_s.gsub(/::.*/, "") # => "Workstation" or "OA"
      namespace_to_domain = {
        "Workstation" => :workstation,
        "OA" => :oa,
        "MobileAnalytics" => :mobile_analytics,
        "AuthPage" => :auth_page,
        "Project" => :project,
        "SalesSheets" => :sales_sheets,
        "MastersRegistry" => :masters_registry,
        "Accounting" => :accounting,
        "AccountingD3" => :accounting_d3,
        "AccountingSub" => :accounting_sub,
        "SourceOfStream" => :source_of_streams,
        "PhysicalReporting" => :physical_reporting,
        "ConflictManager" => :conflict_manager,
        "PromoPlayer" => :promo_player,
        "AudioPlayer" => :audio_player,
        "Audience" => :audience,
        "Video" => :video,
        "Contract" => :contract,
        "Royalties" => :royalties,
        "ReactWorkstation" => :react_workstation,
        "BlacklistManager" => :blacklist_manager,
        "Users" => :users,
        "Collaborator" => :collaborator,
        "OrchardAdminComponents" => :orchard_admin_components
      }

      DOMAINS[namespace_to_domain[site_name]]
    end
    # rubocop:enable Metrics/MethodLength

    def query_from_params(page)
      default_queries = page.params[:queries]
      passed_params = page.instance_variable_get("@merged_params") || {}
      new_queries = passed_params[:queries]
      return unless default_queries || new_queries # otherwise appends ?
      default_queries ||= {}
      new_queries ||= {}
      default_queries.merge(new_queries)
    end
  end
end
