# frozen_string_literal: true

require "cgi"
require "shopify_cli/theme/dev_server"

module ShopifyCLI
  module Theme
    module Extension
      class DevServer < ShopifyCLI::Theme::DevServer
        class ProxyParamBuilder
          def build
            # Core doesn't support replace_extension_templates
            return {} if core?(current_path)

            (request_templates + syncer_templates)
              .select(&:liquid?)
              .uniq(&:relative_path)
              .reject { |file| proxy_cannot_render?(file) }
              .map { |file| as_param(file) }
              .to_h
          end

          def with_core_endpoints(core_endpoints)
            @core_endpoints = core_endpoints
            self
          end

          def with_syncer(syncer)
            @syncer = syncer
            self
          end

          def with_rack_env(rack_env)
            @rack_env = rack_env
            self
          end

          def with_extension(extension)
            @extension = extension
            self
          end

          private

          def proxy_cannot_render?(file)
            !(file&.relative_path&.include?("blocks/") || file&.relative_path&.include?("snippets/"))
          end

          def as_param(file)
            if file&.relative_path&.include?("blocks/")
              ["replace_extension_templates[blocks][#{file.relative_path}]", file.read]
            elsif file&.relative_path&.include?("snippets/")
              ["replace_extension_templates[snippets][#{file.relative_path}]", file.read]
            end
          end

          def request_templates
            cookie_files
              .map { |file_path| @extension[file_path] unless @extension.nil? }
              .compact
          end

          def syncer_templates
            @syncer&.pending_files || []
          end

          def cookie_files
            CGI::Cookie.parse(cookie)["hot_reload_files"].join.split(",") || []
          end

          def core?(path)
            core_endpoints.include?(path)
          end

          def current_path
            rack_env["PATH_INFO"]
          end

          def cookie
            rack_env["HTTP_COOKIE"]
          end

          def core_endpoints
            @core_endpoints || []
          end

          def rack_env
            @rack_env || {}
          end
        end
      end
    end
  end
end