module Resource
  class Base
    def self.client
      Resource::Client.instance
    end

    def self.find(id)
      result = Rails.cache.fetch("resource/#{name.underscore}/#{id}", expires_in: 12.hours) do
        get("/#{resource_name}/#{id}")
      end
      if result.present? && result['Erreur'].present?
        Rails.cache.delete("resource/#{name.underscore}/#{id}")
      end
      result
    end

    def self.where(params)
      get("/#{resource_name}?#{params.to_query}")
    end

    def self.search(params, page, per_page)
      where(params_to_where(params).merge(page: page, per_page: per_page))
    end

    def self.params_to_where(params)
      params ||= {}
      params = params.to_unsafe_h if params.respond_to?(:to_unsafe_h)
      params.delete_if { |_, v| v.blank? }.reduce({}) do |reducer, (k, v)|
        reducer.tap do |hash|
          matches = k.match(/^(.+)_((?:not_)?[^_]+)$/)
          if matches
            field = matches[1]
            matcher = matches[2]
            case matcher.to_sym
            when :eq
              hash[field] = v
            when :gt, :lt, :gteq, :lteq
              hash[field] ||= {}
              hash[field][:"#{matcher.sub(/q$/ , ''.freeze)}"] = v
            when :cont
              hash[field] = "*#{v}*"
            else
            end
          end
        end
      end
    end

    def self.create(params)
      result = put("/#{resource_name}", params)
      if result.present? && result['Erreur'].blank?
        Rails.cache.delete("resource/#{name.underscore}/all")
      end
      result
    end

    def self.update(id, params)
      result = post("/#{resource_name}/#{id}", params)
      if result.present? && result['Erreur'].blank?
        Rails.cache.delete("resource/#{name.underscore}/#{id}")
        Rails.cache.delete("resource/#{name.underscore}/all")
      end
      result
    end

    def self.destroy(id)
      result = delete("/#{resource_name}/#{id}")
      if result.present? && result['Erreur'].blank?
        Rails.cache.delete("resource/#{name.underscore}/#{id}")
        Rails.cache.delete("resource/#{name.underscore}/all")
      end
      result
    end

    def self.resource_name
      self.name.underscore.match(/(\w+)_resource$/)[1]
    end

    def self.get(url, params = nil)
      request(:get, url, params)
    end

    def self.post(url, params = nil)
      request(:post, url, params)
    end

    def self.put(url, params = nil)
      request(:put, url, params)
    end

    def self.delete(url, params = nil)
      request(:delete, url, params)
    end
    
    def self.request(verb, url, params = nil)
      client.request(verb, url, params, headers)
    end

    def self.headers
      {
        "x-user-token": Current.user&.persistence_token,
        "x-soc-code": Pixtech.instance&.value_for('apg_company_code')
      }
    end
  end
end
