require 'rcs-common/trace'

module RCS
  module Intelligence
    module Virtual
      extend Tracer
      extend self

      URL_SCHEMA_REGEXP = /^(.+)\:\/\//

      def process_url_evidence(target_entity, url_evidence)
        url = url_evidence.data['url']
        uri = parse_url(url)

        if !uri
          trace(:warn, "Malformed url - #{url}")
          return
        end

        if virtual_entity = find_virtual_entity(uri)
          trace(:debug, "Virtual entity #{virtual_entity.name} matched url #{url}")
        end

        # Do not create a virtual entity (they are created manually)
        return unless virtual_entity

        link_params = {from: target_entity, to: virtual_entity, level: :automatic, type: :virtual, versus: :out, info: {url: [url]}}
        RCS::DB::LinkManager.instance.add_link(link_params)
      end

      def parse_url(url)
        url2 = URI.encode(URI.decode(url))
        url2 = "http://#{url2}" if url2 !~ URL_SCHEMA_REGEXP
        return URI.parse(url2)
      rescue Exception => ex
        return nil
      end

      def find_virtual_entity(uri)
        decoded_host_and_path = URI.decode(uri.host) + URI.decode(uri.path)
        regexp = Regexp.new(Regexp.escape(decoded_host_and_path), Regexp::IGNORECASE)
        Entity.virtuals.with_handle(:url, regexp).first
      end
    end
  end
end
