<?php

namespace Ulmus\Ldap;

use Ulmus\{ Ulmus, EventTrait, Query, Common\EntityResolver, Common\EntityField };

use Ulmus\Annotation\Classes\{ Method, Table, Collation, };
use Ulmus\Annotation\Property\{ Field, Filter, Relation, OrderBy, Where, Join, Virtual, On, WithJoin, };
use Ulmus\Annotation\Property\Field\{ Id, ForeignKey, CreatedAt, UpdatedAt, Datetime as DateTime, Date, Time, Bigint, Tinyint, Text, Mediumtext, Longtext, };
use Ulmus\Annotation\Property\Relation\{ Ignore as RelationIgnore };

trait EntityTrait {
    use \Ulmus\EntityTrait;

    /**
     * @Ignore
     */
    public static function resolveEntity() : EntityResolver
    {
        return Ulmus::resolveEntity(static::class);
    }

    /**
     * @Ignore
     */
    public static function repository(string $alias = Repository::DEFAULT_ALIAS) : Repository
    {
        return new Repository(static::class, $alias);
    }

    /**
     * @Ignore
     */
    public static function field($name, ? string $alias = null) : EntityField
    {
        return new EntityField(static::class, $name, $alias ?: Repository::DEFAULT_ALIAS, Ulmus::resolveEntity(static::class));
    }

    /**
     * @Ignore
     */
    public static function fields(array $fields, ? string $alias = null) : string
    {
        return implode(', ', array_map(function($item) use ($alias){
            return static::field($item, $alias);
        }, $fields));
    }
}