module ReeDao::DSL::ClassMethods

def dao(name, &proc)

def dao(name, &proc)
  if !block_given?
    raise Ree::Error.new("dao requires block to link specific db connection as :db => link :some_db, as: :db", :invalid_dsl_usage)
  end
  dsl = Ree::ObjectDsl.new(
    Ree.container.packages_facade, name, self, :object
  )
  dsl.instance_exec(&proc)
  dsl.tags(["object", "dao"])
  db_link = dsl.object.links.detect { _1.as == :db }
  if !db_link
    raise Ree::Error.new("dao should link specific db connection as :db => link :some_db, as: :db", :invalid_dsl_usage)
  end
  if dsl.object.factory? && dsl.object.factory != :build
    raise Ree::Error.new("dao DSL automatically assigns `factory :build` to object. Custom factory methods are not supported", :invalid_dsl_usage)
  end
  dsl.link(:build_dao, from: :ree_dao)
  dsl.factory(:build)
  dsl.singleton
  # automatically assign table name from object class
  table(
    ReeString::Underscore.new
      .call(self.name.split("::").last.gsub(/dao$/i, ''))
      .to_sym
  )
  Ree.container.compile(dsl.package, name)
end

def default_select_columns(columns)

def default_select_columns(columns)
  @default_select_columns = columns
  nil
end

def filter(name, proc)

def filter(name, proc)
  filters = self.instance_variable_get(:@filters)
  if filters.nil?
    filters = []
    self.instance_variable_set(:@filters, filters)
  end
  filters.push(DaoFilter.new(name, proc))
  nil
end

def primary_key(primary_key)

def primary_key(primary_key)
  @primary_key = primary_key
  nil
end

def schema(dto_class, &proc)

def schema(dto_class, &proc)
  mapper_factory = ReeMapper.get_mapper_factory(
    Object.const_get(self.name.split('::').first)
  )
  mapper = mapper_factory
    .call
    .use(:db_dump)
    .use(:db_load, dto: dto_class, &proc)
  self.instance_variable_set(:@schema_mapper, mapper)
  nil
end

def table(table_name)

def table(table_name)
  @table = table_name
end