class MiniSqlMultisiteConnection < MiniSql::Connection

  class CustomBuilder < MiniSql::Builder

    def initialize(connection, sql)
      super
    end

    def secure_category(secure_category_ids, category_alias = 'c')
      if secure_category_ids.present?
        where("NOT COALESCE(" << category_alias << ".read_restricted, false) OR " << category_alias << ".id in (:secure_category_ids)", secure_category_ids: secure_category_ids)
      else
        where("NOT COALESCE(" << category_alias << ".read_restricted, false)")
      end
      self
    end
  end

  class ParamEncoder
    def encode(*sql_array)
      # use active record to avoid any discrepencies
      ActiveRecord::Base.send(:sanitize_sql_array, sql_array)
    end
  end

  def self.instance
    new(nil, param_encoder: ParamEncoder.new)
  end

  # we need a tiny adapter here so we always run against the
  # correct multisite connection
  def raw_connection
    ActiveRecord::Base.connection.raw_connection
  end

  def build(sql)
    CustomBuilder.new(self, sql)
  end

  def sql_fragment(query, *args)
    if args.length > 0
      param_encoder.encode(query, *args)
    else
      query
    end
  end

end