<?php

namespace Ulmus\Ldap\Entity;

use Ulmus\Ldap\Entity\Field\{ Datetime, LdapDatetime };

use Ulmus\Attribute\Property\{Field, Relation\Ignore, Virtual};

use Ulmus\Ldap\Attribute\Obj\ObjectClass;

#[ObjectClass("user")]
class User
{
    use \Ulmus\Ldap\EntityTrait;

    #[Field]
    public string $samaccountname;

    #[Field]
    public string $mail;

    #[Field]
    public string $mailNickname;

    #[Field(name: "givenname")]
    public string $firstname;

    #[Field(name: "sn")]
    public string $lastname;

    #[Field]
    public string $displayName;

    #[Field]
    public string $name;

    #[Field]
    public string $canonicalName;

    #[Field]
    public string $userPrincipalName;

    #[Field]
    public string $description;

    #[Field(name: "st")]
    public string $state;

    #[Field(name: "physicalDeliveryOfficeName")]
    public string $officeName;

    #[Field]
    public string $company;

    #[Field]
    public string $department;

    #[Field]
    public string $telephoneNumber;

    #[Field]
    public string $title;

    ##[Field(readonly:true)]
    # public ? array $memberOf;

    ##[Field(readonly:true)]
    #public ? array $proxyAddresses;

    #[Field]
    public int $userAccountControl;

    #[Field]
    public string $extensionAttribute1;

    #[Field]
    public string $extensionAttribute2;

    #[Field]
    public string $extensionAttribute3;

    #[Field]
    public string $extensionAttribute4;

    #[Field]
    public string $extensionAttribute5;

    #[Field]
    public string $extensionAttribute6;

    #[Field]
    public string $extensionAttribute7;

    #[Field]
    public string $extensionAttribute8;

    #[Field]
    public string $extensionAttribute9;

    #[Field]
    public string $extensionAttribute10;

    #[Field]
    public string $extensionAttribute11;

    #[Field]
    public string $extensionAttribute12;

    #[Field]
    public string $extensionAttribute13;

    #[Field]
    public string $extensionAttribute14;

    #[Field]
    public string $extensionAttribute15;

    #[Field]
    public int $logonCount;

    #[Field(name: "unicodePwd")]
    public string $unicodePassword;

    #[Field]
    public string $userPassword;

    #[Field]
    public string $scriptPath;

    #[Field]
    public string $sid;

    #[Field]
    public string $targetAddress;

    #[Field(name: "lastLogon", readonly: true)]
    public LdapDatetime $lastLogon;

    #[Field(name: "whenCreated", readonly: true)]
    public LdapDatetime $whenCreated;

    #[Field(name: "whenChanged", readonly: true)]
    public LdapDatetime $whenChanged;

    public function __toString() : string
    {
        return implode(' ', array_filter([ $this->firstname ?? "", $this->lastname ?? "" ])) ?: ( $this->displayName ?? "" );
    }

    public function memberOfGroup() : array
    {
        $arr = array_map(fn($e) => explode('=', explode(',', $e)[0])[1], $this->memberOf);
        usort($arr, 'strcasecmp');

        return $arr;
    }

    public function brokenMigration() : bool
    {
        if ( empty($this->targetAddress) ) {
            foreach($this->proxyAddresses ?? [] as $proxy) {
                if ( str_contains(strtolower($proxy), 'x500') ) {
                    return true;
                }
            }
        }

        return false;
    }

    public function migrated() : bool
    {
        return ! empty($this->targetAddress);
    }

    public function unmigrated() : bool
    {
        return empty($this->targetAddress) && empty($this->proxyAddresses);
    }
}