<?php

namespace App\Services;

use \DateTime;

function cmp($a, $b){
    /* echo var_dump($b);echo var_dump($a['w']);echo var_dump($b['w']); */
    if(isset($a['w'])) {
	if(isset($b['w'])){
	    if ($a['w'] == $b['w']) {return 0;}
	    return ($a['w'] < $b['w']) ? -1 : 1;
	} else {
	    return -1;
	}
    } else {
	if(isset($b['w'])){
	    return 1;
	} else {
	    return 0;
	}
    }
}

function cmp_by_name($a, $b){
    return strcmp($a['name'], $b['name']);
}

function cmp_by_cn($a, $b){
    return strcmp($a['cn'][0], $b['cn'][0]);
}


class LdapService
{
    private $host;
    private $rdn;
    private $pass;
    private $base;
    private $bind;
    private $conn;
    
    public function __construct($config)
    {
        $this->host = $config['host'];
	$this->rdn = $config['rdn'];
	$this->pass = $config['pass'];
	$this->base = $config['base'];
	$this->conn = ldap_connect($this->host);
	if ($this->conn){
	    ldap_set_option($this->conn, LDAP_OPT_PROTOCOL_VERSION, 3);
	    ldap_set_option($this->conn, LDAP_OPT_REFERRALS, 0);
	    $this->bind = ldap_bind($this->conn, $this->rdn, $this->pass);
	}
	
    }

    function __destruct() {
	ldap_close($this->conn);
    }

    public function getHost(){
	return $this->host;
    }

    public function getBase(){
	return $this->base;
    }
    
    public function group_list(){

	$filter = "(&(objectClass=groupOfNames)(cn=*))";
	$dn_list = "ou=groups,$this->base";
	$fields = array("cn");
	
	if($this->bind){
	    
	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $res = ldap_get_entries($this->conn, $sr);
	    $groups = [];
	    /* echo var_dump($res); */
	    $i = 0 ;
	    for ($i; $i < $res['count']; $i++) {
		$groups[] = $res[$i]['cn'][0];
	    }
	    return $groups;
	}
    }

    public function del_operator($name){
        $user_dn = "cn=$name,ou=addressbook,dc=mc03,dc=local";
        $user= [];
        $user['uid'] = [];
        $user['o'] = [];
        $user['userPassword'] = [];
        $res = ldap_mod_replace($this->conn, $user_dn, $user);
        return $res;
    }

    public function edit_operator($name, $data){
        $user_dn = "cn=$name,ou=addressbook,dc=mc03,dc=local";
        $user= [];
        $user['uid'] = $data['login'];
        $user['o'] = $data['role'];
        if(isset($data['password'])){
            $user['userPassword'] = '{MD5}'.base64_encode(pack("H*", md5($data['password'])));
        }
        $res = ldap_mod_replace($this->conn, $user_dn, $user);
        return $res;
    }

    public function operator_list(){

	$filter = "(&(objectClass=InetOrgPerson)(uid=*)(o=*))";
	$dn_list = "ou=addressbook,$this->base";
	$fields = array("cn", "employeetype", "uid", "o");
	
	if($this->bind){
	    
	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $res = ldap_get_entries($this->conn, $sr);
	    $operators = [];
	    // echo var_dump($res);
	    $i = 0 ;
	    for ($i; $i < $res['count']; $i++) {
		$operator = [];
		$operator['name'] = $res[$i]['cn'][0];
		$operator['employeetype'] = $res[$i]['employeetype'][0];
		$operator['username'] = $res[$i]['uid'][0];
		$operator['role'] = $res[$i]['o'][0];
		
		$operators[] = $operator;
	    }
	    return $operators;
	}
	
    }

    public function get_operator($name){

	$filter = "(&(objectClass=InetOrgPerson)(cn=$name))";
	$dn_list = "ou=addressbook,$this->base";
	$fields = array("cn", "employeetype", "uid", "o");
	
	if($this->bind){
	    
	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $res = ldap_get_entries($this->conn, $sr);
            // echo var_dump($res);
            $operator = [];
            $operator['name'] = $res[0]['cn'][0];
            $operator['employeetype'] = $res[0]['employeetype'][0];
            $operator['username'] = $res[0]['uid'][0];
            $operator['role'] = $res[0]['o'][0];
            
	    return $operator;
	}
    }


    public function archive_list(DateTime $startDate, DateTime $stopDate){
	$minDate = $startDate->setTime('00','00')->format('YmdHis\Z');
	$maxDate = $stopDate->setTime('23','59')->format('YmdHis\Z');
	
	$tempDate = (new DateTime('-30 days'))->format('YmdHis\Z');
	$filter = "(&(objectClass=systemProtocol)
                     (protocolStartDate>=$minDate)
                     (protocolStartDate<=$maxDate))";
	$dn_list = "ou=archive,$this->base";
	$fields = array("cn", "protocolName",
			"creator", "protocolStartDate",
			"protocolEndDate");
	if($this->bind){
	    
	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $res = ldap_get_entries($this->conn, $sr);
	    $archives = [];
	    $i = 0 ;
	    for ($i; $i < $res['count']; $i++) {
		$arch = [];
		$arch['uid'] = $res[$i]['cn'][0];
		$arch['name'] = $res[$i]['protocolname'][0];
		$arch['user'] = $res[$i]['creator'][0];
		$arch['start_time'] = convertFromProtocolDate($res[$i]['protocolstartdate'][0]);
		$arch['stop_time'] = convertFromProtocolDate($res[$i]['protocolenddate'][0]);
		
		
		$archives[] = $arch;
	    }
	    return $archives;
	}
	
    }
    
    public function archive_record($uid){
	/* Получить данные про архив протокола */
	$filter = "(&(objectClass=systemProtocol)(cn=$uid))";
	$dn_list = "ou=archive,$this->base";
	$fields = array("cn", "protocolName",
			"creator", "protocolStartDate",
			"protocolEndDate", "protocolDescription");
	
	if($this->bind){
	    
	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $res = ldap_get_entries($this->conn, $sr);
	    $arch = [];
	    $arch['uid'] = $res[0]['cn'][0];
	    $arch['name'] = $res[0]['protocolname'][0];
	    $arch['user'] = $res[0]['creator'][0];
	    $arch['start_time'] = convertFromProtocolDate($res[0]['protocolstartdate'][0]);
	    $arch['stop_time'] = convertFromProtocolDate($res[0]['protocolenddate'][0]);
	    if($res[0]['protocoldescription']){
		$arch['descr'] = $res[0]['protocoldescription'][0];
	    }
	    
	}
	/* Получить список абонентов */
	$filter = "(&(objectClass=protocolSubscriber)(cn=*))";
	$dn_list = "cn=".$uid.",ou=archive,$this->base";
	$fields = array("cn", "subscriberName", "sn",
			"subscriberPhone", "subscriberPosition",
			"subscriberStatus", "notificationAttempts",
			"callEndTime");
	
	if($this->bind){
	    
	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $res = ldap_get_entries($this->conn, $sr);
	    /* echo var_dump($res); */
	    $i = 0 ;
	    for ($i; $i < $res['count']; $i++){
		$meta = [];
		if(isset($res[$i]['sn'])){
		    $departName = $res[$i]['sn'][0];
		} else {
		    $departName = "";
		}
		$meta[] = $res[$i]['subscribername'][0];
		$meta[] = $res[$i]['subscriberposition'][0];
		$meta[] = $res[$i]['subscriberphone'][0];
		$meta[] = $departName;
		$meta[] = $res[$i]['subscriberstatus'][0];
		$meta[] = convertFromProtocolDate($res[$i]['callendtime'][0], 'short');
		$meta[] = $res[$i]['notificationattempts'][0];
		$arch['meta'][$departName][] = $meta;
	    }
	    return $arch;
	}
	
    }
    
    public function get_group($name) {
	$filter = "(&(objectClass=inetOrgPerson)(memberof=cn=$name,ou=groups,dc=mc03,dc=local))";
	$dn = "ou=addressbook,$this->base";
	$fields = array("cn", "mobile", "employeetype", "uidnumber");

	if($this->bind){

	    $sr = ldap_search($this->conn, $dn, $filter, $fields);
	    $user = ldap_get_entries($this->conn, $sr);
	    $users = [];
	    if ($user['count'] != 0){
		$i = 0;
		for ($i; $i < $user['count']; $i++){
		    $j = 0;
		    $elt = array();
		    $elt['dn'] = $user[$i]['dn'];
		    for ($j; $j < $user[$i]['count']; $j++){
			$tag = $user[$i][$j]; 
			$k = 0;
			for ($k; $k < $user[$i][$tag]['count']; $k++){
			    if ($tag == 'uidnumber'){
				$elt['w'] = (int)$user[$i][$tag][0];
			    } else {
				$elt[$tag][$k] = $user[$i][$tag][$k];
			    }
			}
		    }
		    /* echo var_dump($elt); */
		    $users[$name][] = $elt;
		}
		$temp = $users[$name];
		ksort($temp, SORT_STRING);
		usort($temp, "App\Services\cmp");
		$users[$name] = $temp;
		return $users;
	    }
	    $users[$name] = [];
	    return $users;
	}
    }

    
    public function search_groups($q)
    {
	if ($q == "*"){
	    $filter = "(&(objectClass=groupOfNames)(cn=*))";
	} else {
	    $filter = "(&(objectClass=groupOfNames)(cn=*$q*))";
	}
	$dn_list = "ou=groups,$this->base";
	$fields = array("cn", "gidnumber", "member");

	if($this->bind){

	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $group = ldap_get_entries($this->conn, $sr);

	    $i = 0;
	    $groups = [];
	    for ($i; $i < $group['count']; $i++){
		$groups[$i]['name'] = $group[$i]['cn'][0];
		$groups[$i]['count'] = $group[$i]['member']['count'] - 1;
		if (isset($group[$i]['gidnumber'])){
		    $groups[$i]['w'] = (int)$group[$i]['gidnumber'][0];
		}
	    }
	    uasort($groups, "App\Services\cmp_by_name");
	    usort($groups, "App\Services\cmp");
	    return $groups;
	}
    }

    public function get_depart($name) {
	if($name != 'другие'){
	    $filter = "(&(objectClass=inetOrgPerson)(memberof=cn=$name,ou=departs,dc=mc03,dc=local))";
	} else {
	    $filter = "(&(objectClass=inetOrgPerson)(!(memberof=*)))";
	}
	$dn = "ou=addressbook,$this->base";
	$fields = array("cn", "mobile", "employeetype", "uidnumber");

	if($this->bind){

	    $sr = ldap_search($this->conn, $dn, $filter, $fields);
	    $user = ldap_get_entries($this->conn, $sr);
	    $i = 0;
	    $users = [];
	    for ($i; $i < $user['count']; $i++){
		$j = 0;
		$elt = array();
		$elt['dn'] = $user[$i]['dn'];
		for ($j; $j < $user[$i]['count']; $j++){
		    $tag = $user[$i][$j]; 
		    $k = 0;
		    for ($k; $k < $user[$i][$tag]['count']; $k++){
			if ($tag == 'uidnumber'){
			    $elt['w'] = (int)$user[$i][$tag][0];
			} else {
			    $elt[$tag][$k] = $user[$i][$tag][$k];
			}
		    }
		}
		/* echo var_dump($elt); */
		$users[$name][] = $elt;
	    }
	    $temp = $users[$name];
	    if($temp){
		ksort($users, SORT_STRING);
		usort($temp, "App\Services\cmp");
	    }
	    $users[$name] = $temp;
	    return $users;
	}
    }
    
    public function search_departs($q)
    {
	if ($q == "*"){
	    $filter = "(&(objectClass=groupOfNames)(cn=*))";
	} else {
	    $filter = "(&(objectClass=groupOfNames)(cn=*$q*))";
	}
	$dn_list = "ou=departs,$this->base";
	$fields = array("cn", "gidnumber");

	if($this->bind){

	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $group = ldap_get_entries($this->conn, $sr);
	    $groups = [];
	    $i = 0;
	    for ($i; $i < $group['count']; $i++){
		$groups[$i]['name'] = $group[$i]['cn'][0];
		if (isset($group[$i]['gidnumber'])){
		    $groups[$i]['w'] = (int)$group[$i]['gidnumber'][0];
		}
	    }
	    uasort($groups, "App\Services\cmp_by_name");
	    uasort($groups, "App\Services\cmp");

	    /* ksort($groups, SORT_STRING); */

	    if ($q == "*"){
		$groups[] = ['name' => 'другие'];
	    } 
	    return $groups;
	}
    }

    public function search_depart_by_member($name)
    {
        $filter = "(&(objectClass=groupOfNames)(member=cn=$name,ou=addressbook,dc=mc03,dc=local))";
        $dn_list = "ou=departs,$this->base";
        $fields = array("cn", "gidnumber");

        if($this->bind){

	    $sr = ldap_search($this->conn, $dn_list, $filter, $fields);
	    $group = ldap_get_entries($this->conn, $sr);
	    $groups = [];
	    $i = 0;
	    for ($i; $i < $group['count']; $i++){
                $groups[$i]['name'] = $group[$i]['cn'][0];
                if (isset($group[$i]['gidnumber'])){
		    $groups[$i]['w'] = (int)$group[$i]['gidnumber'][0];
                }
	    }
	    return $groups;
        }
    }

    
    public function search($q){
	if ($q == "*"){
	    $filter_u = "(&(objectClass=inetOrgPerson)(cn=*))";
	} else {
	    $filter_u = "(&(objectClass=inetOrgPerson)(cn=*$q*))";
	}
	return $this->search_users($filter_u);
    }

    public function search_with_group_without_list($q, $name){
	$departs = $this->search_departs($q);
	$s = "";
	foreach($departs as $d) {
	    $s = $s."(memberof=cn=". $d['name'].",ou=departs,dc=mc03,dc=local)";
	}
	/* $s = "(|$s)"; */
	if ($q == "*"){
	    $filter_u = "(&(objectClass=inetOrgPerson)(cn=*))";
	} else {
	    $filter_u = "(&(objectClass=inetOrgPerson)(|(cn=*$q*)$s)(!(memberof=cn=". $name.",ou=groups,dc=mc03,dc=local)))";
	}
	
	
	return $this->search_users($filter_u);
    }

    
    private function search_users($filter_u){
	$filter_g = "(&(objectClass=groupOfNames)(cn=*))";
	$filter_l = "(&(objectClass=groupOfNames)(cn=*))";
	$dn_user = "ou=addressbook,$this->base";
	$dn_group = "ou=departs,$this->base";
	$dn_list = "ou=groups,$this->base";
	$fields_u = array("cn", "mobile", "employeetype", "memberOf", "uidnumber");
	$fields_g = array("cn", "gidnumber");
	$fields_l = array("cn", "gidnumber");

	/* } else {
	   $filter = "(&(objectClass=inetOrgPerson)(cn=*))";
	   } */
	
	if($this->bind){

	    $sr = ldap_search($this->conn, $dn_user, $filter_u, $fields_u);
	    $user = ldap_get_entries($this->conn, $sr);

	    $sr = ldap_search($this->conn, $dn_group, $filter_g, $fields_g);
	    $group = ldap_get_entries($this->conn, $sr);

	    $sr = ldap_search($this->conn, $dn_list, $filter_l, $fields_l);
	    $list = ldap_get_entries($this->conn, $sr);
	    
	    $i = 0;
	    $groups = [];
	    for ($i; $i < $group['count']; $i++){
		$groups[$group[$i]['dn']]['name'] = $group[$i]['cn'][0];
		if (isset($group[$i]['gidnumber'])){
		    $groups[$group[$i]['dn']]['w'] = (int)$group[$i]['gidnumber'][0];
		} else {
		    $groups[$group[$i]['dn']]['w'] = 999;
		}
	    }
	    /* usort($groups, "App\Services\cmp"); */

	    $i = 0;
	    $lists = [];
	    for ($i; $i < $list['count']; $i++){
		$lists[$list[$i]['dn']] = $list[$i]['cn'][0];
	    }

	    $i=0;
	    /* foreach ($groups as $gr => $depart){
	       $users[$depart] = [];
	       } */
	    $users = [];
	    for ($i; $i < $user['count']; $i++){
		$j = 0;
		$elt = array();
		$elt['dn'] = $user[$i]['dn'];
		$temp = [];
		for ($j; $j < $user[$i]['count']; $j++){
		    $tag = $user[$i][$j]; 
		    $k = 0;
		    for ($k; $k < $user[$i][$tag]['count']; $k++){
			if ($tag == 'uidnumber'){
			    $elt['w'] = (int)$user[$i][$tag][0];
			}
			if ($tag == 'memberof') {
			    if (isset($groups[$user[$i][$tag][$k]])) {
				$group_name = $groups[$user[$i][$tag][$k]];
				$temp[] = $group_name;
			    }
			} else {
			    $elt[$tag][$k] = $user[$i][$tag][$k];
			}
		    }
		}
		if ($temp){
		    foreach ($temp as $tmp) {
			$users[$tmp['name']][] = $elt;
			$users[$tmp['name']]['w'] = $tmp['w'];
		    }
		} else {
		    $users['другие'][] = $elt;
		}
	    }
	    /* echo var_dump($users);
	       foreach ($users as $k => $u){
	       uasort($u, "App\Services\cmp_by_cn");
	       $users[$k] = $u;
	       } */
	    
	    /* uasort($groups, "App\Services\cmp_by_name"); */
	    uasort($users, "App\Services\cmp");

	    foreach($users as $k => $u){
		unset($u['w']);
		$users[$k] = $u;
	    }
	    return $users;
	} else {
	    return false;
	}
    }


    public function get_users($names){
	$users = [];
	foreach ($names as $name){
	    $users[] = $this->get_user($name);
	}
	usort($users, "App\Services\cmp");
	return $users;
    }
    
    public function get_user($name){
	$filter = "(&(objectClass=inetOrgPerson)(cn=$name))";
	$dn = "ou=addressbook,$this->base";
	$fields = array("cn", "mobile", "employeetype", "uidnumber");

	if($this->bind){

	    $sr = ldap_search($this->conn, $dn, $filter, $fields);
	    $user = ldap_get_entries($this->conn, $sr);
	    
	    $j = 0;
	    $res = [];
	    for ($j; $j < $user[0]['count']; $j++){
		$tag = $user[0][$j]; 
		$k = 0;
		for ($k; $k < $user[0][$tag]['count']; $k++){
		    if ($tag == 'uidnumber'){
			$res['w'] = (int)$user[0][$tag][0];
		    } else {
			$res[$tag][$k] = $user[0][$tag][$k];
		    }
		}
	    }
	    /* echo var_dump($res); */
	    /* echo var_dump($user); */
	    return $res;
	}
	
    }

    public function update_user($name, $user){
        $dn = "cn=".$name.", ou=addressbook,".$this->base;
        $item = [];
        $item['objectclass'][] = "top";
        $item["objectclass"][] = "inetOrgperson";
        $item["objectclass"][] = "extensibleObject";
        /* $item['cn'] = $user['cn']; */
        $item['sn'] = $user['cn'];
	if ($user['employeetype']){
	    $item['employeetype'] = $user['employeetype'];
	} else {
	    $item['employeetype'] = [];
	}

	if ($user['uidNumber']){
	    $item['uidNumber'] = $user['uidNumber'];
	} else {
	    $item['uidNumber'] = [];
	}
        if ($user['mobile']){
	    $item['mobile'] = $user['mobile'];
        }
        // $res = ldap_mod_add($this->conn, $dn, $ext);
        $results = ldap_mod_replace($this->conn, $dn, $item);
	if($name != $user['cn']){
	    $new_rdn = "cn=".$user['cn'];
	    $parrent = "ou=addressbook,".$this->base;
	    ldap_rename_ext($this->conn, $dn, $new_rdn, $parrent, true);
	}
    }
    
    public function insert_user($data){
	$conn = $this->conn;
	$entr = [];
	$entr['objectclass'][0] = "top";
	$entr["objectclass"][1] = "inetOrgPerson";
	$cn = $data['family'] . " " . $data['name'] . " " . $data['second'];
	$entr["cn"] = $cn;
	$entr["sn"] = $data['family'];
	$entr["employeeType"] = $data['poss'];
	foreach ($data['numbers'] as $number) {
	    if($number){
		$entr["mobile"][] = $number;
	    }
	}
	/* echo var_dump($entr); */
	$rdn = "cn=".$cn.", ou=addressbook,".$this->base;
	$res = ldap_add($this->conn, $rdn, $entr);
	/* echo var_dump($res); */
    }

    public function insert_user1($user){
        $item = [];
        $item['objectclass'][] = "top";
        $item["objectclass"][] = "inetOrgperson";
        $item["objectclass"][] = "extensibleObject";
        $item['cn'] = $user['cn'];
        $item['sn'] = $user['cn'];
	if ($user['employeetype']){
	    $item['employeetype'] = $user['employeetype'];
	}
	if ($user['uidNumber']){
	    $item['uidNumber'] = $user['uidNumber'];
	} 
        if ($user['mobile']){
	    $item['mobile'] = $user['mobile'];
        }
        $rdn = "cn=".$user['cn'].", ou=addressbook,".$this->base;
        echo var_dump($item);
        $res = ldap_add($this->conn, $rdn, $item);
        return $res;
    }


    public function insert_archive($data){
	$conn = $this->conn;
	$uid = md5($data['stop_time']."".$data['start_time']."".$data['descr']);

	//--TODO: вынести пробразование времени в отдельную ф-ю
	// Преобразуем строку в объект DateTime
	$dateTime = DateTime::createFromFormat('H:i:s d.m.Y', $data['start_time']);

	if ($dateTime === false) {
	    throw new Exception("Неверный формат даты/времени");
	}

	// Форматируем в GeneralizedTime (YYYYMMDDHHMMSSZ)
	$protocolStartDate = $dateTime->format('YmdHis\Z');

	$dateTime = DateTime::createFromFormat('H:i:s d.m.Y', $data['stop_time']);

	if ($dateTime === false) {
	    throw new Exception("Неверный формат даты/времени");
	}

	// Форматируем в GeneralizedTime (YYYYMMDDHHMMSSZ)
	$protocolEndDate = $dateTime->format('YmdHis\Z');

	
	
	$entr = [ 'objectclass' => ["top", "systemProtocol"],
		  /* $uid = ldap_escape(base64_encode(pack("H*", md5($data['meta'])))); */
		  'cn' => $uid,
		  'sn' => $data['session_id'],
		  'protocolName' => $data['name'],
		  'protocolStartDate'=> $protocolStartDate,
		  'protocolEndDate' => $protocolEndDate];
	
	if(!empty($data['descr'])){
	    $entr['protocolDescription'] = $data['descr'];
	}
	$entr["creator"] = $data['user'];
	$rdn = "cn=".$uid.", ou=archive,".$this->base;
	$res = ldap_add($this->conn, $rdn, $entr);

	$x = 1;
	foreach($data['meta'] as $group){
	    foreach($group as $user){
		$subscriberEntry = [
		    'objectClass' => ['protocolSubscriber', 'top'],
		    'cn' => $x,
		    'subscriberName' => $user[0],
		    'subscriberOrder' => $x,
		    'subscriberPhone' => $user[2],
		    'subscriberStatus' => $user[4],
		    'notificationAttempts' => $user[6]
		];
		if(!empty($user[3])){
		    $subscriberEntry['sn'] = $user[3];
		}

		if(!empty($user[1])){
		    $subscriberEntry['subscriberPosition'] = $user[1];
		}
		
		list($hours, $minutes, $seconds) = explode(':', $user[5]);
		$dateTime->setTime($hours, $minutes, $seconds);
		$callEndTime = $dateTime->format('YmdHis\Z');
		$subscriberEntry['callEndTime'] = $callEndTime;
		$calldn = "cn=".$x.",cn=".$uid.", ou=archive,".$this->base;
		$res = ldap_add($this->conn, $calldn, $subscriberEntry);
		$x += 1;
	    }
	}
	
    }

    public function archive_delete($uid)
    {
	$archive_dn = "cn=$uid,ou=archive,dc=mc03,dc=local";

	// Сначала удаляем все дочерние записи
	$search = ldap_list($this->conn, $archive_dn,
			    "(objectClass=protocolSubscriber)", ["dn"]);
	$entries = ldap_get_entries($this->conn, $search);
	for ($i = 0; $i < $entries["count"]; $i++) {
            $childDn = $entries[$i]["dn"];
	    ldap_delete($this->conn, $childDn);
	}
	
	$res = ldap_delete($this->conn, $archive_dn);
	return $res;
    }
    
    public function insert_group($group_name, $users){
	$group = [];
	$group['objectclass'][] = "top";
	$group["objectclass"][] = "groupOfNames";
	$group["objectclass"][] = "extensibleObject";
	$group['cn'] = $group_name;
	$group['member'][] = "cn=dummy_member";
	foreach ($users as $user){
	    $name = $user['family'] . " " . $user['name'] . " " . $user['second'];
	    $group['member'][] = "cn=$name, ou=addressbook,$this->base";
	}
	$rdn = "cn=".$group_name.", ou=departs,".$this->base;
	$res = ldap_add($this->conn, $rdn, $group);
    }


    public function create_list($data){
	$group = [];
	$group['objectclass'][] = "top";
	$group["objectclass"][] = "groupOfNames";
	$group["objectclass"][] = "extensibleObject";
	$group['cn'] = $data['name'];
	$group['member'][] = "cn=dummy_member";
	if (isset($data['prio'])){
	    $group['gidNumber'] = $data['prio'];
	}
	$rdn = "cn=".$data['name'].", ou=groups,".$this->base;
	$res = ldap_add($this->conn, $rdn, $group);
    }

    public function create_depart($data){
	$group = [];
	$group['objectclass'][] = "top";
	$group["objectclass"][] = "groupOfNames";
	$group["objectclass"][] = "extensibleObject";
	$group['cn'] = $data['name'];
	$group['member'][] = "cn=dummy_member";
	if (isset($data['prio'])){
	    $group['gidNumber'] = $data['prio'];
	}
	$rdn = "cn=".$data['name'].", ou=departs,".$this->base;
	$res = ldap_add($this->conn, $rdn, $group);
    }
    
    public function insert_list($group_name, $users){
	$group = [];
	$group['objectclass'][] = "top";
	$group["objectclass"][] = "groupOfNames";
	$group["objectclass"][] = "extensibleObject";
	$group['cn'] = $group_name;
	$group['member'][] = "cn=dummy_member";
	foreach ($users as $user){
	    $name = $user['family'] . " " . $user['name'] . " " . $user['second'];
	    $group['member'][] = "cn=$name, ou=addressbook,$this->base";
	}
	$rdn = "cn=".$group_name.", ou=groups,".$this->base;
	$res = ldap_add($this->conn, $rdn, $group);
    }

    public function insert_custom_list($data){
	return 0;
    }

    public function del_user($name){
	$user_dn = "cn=$name,ou=addressbook,dc=mc03,dc=local";
	$res = ldap_delete($this->conn, $user_dn);
	return $res;
    }

    public function modify_group($group_name, $weidth){
	$group_dn = "cn=$group_name,ou=departs,dc=mc03,dc=local";
	if ($weidth !="" and $weidth != "0") {
	    $group['gidNumber'] = $weidth;
	} else {
	    $group['gidNumber'] = [];
	}
	$res = ldap_modify($this->conn, $group_dn, $group);
	return $res;
    }

    public function update_group($group_name, $new_group_name, $weidth){
	$parent = "ou=departs,dc=mc03,dc=local";
	$group_dn = "cn=$group_name,ou=departs,dc=mc03,dc=local";
	
	$new_name = "cn=$new_group_name";
	if ($weidth !="" and $weidth != "0") {
	    $group['gidNumber'] = $weidth;
	} else {
	    $group['gidNumber'] = [];
	}
	
	$res1 = ldap_modify($this->conn, $group_dn, $group);
	$res2 = ldap_rename($this->conn, $group_dn, $new_name, $parent, true);
	echo var_dump($res1);  
	return $res;
    }

    public function del_group($name){
	$group_dn = "cn=$name,ou=departs,dc=mc03,dc=local";
	$res = ldap_delete($this->conn, $group_dn);
	return $res;
    }
    
    public function add_to_group($group_name, $name){
	echo var_dump($group_name);
	echo var_dump($name);
	$group_dn = "cn=$group_name,ou=departs,dc=mc03,dc=local";
	$member['member'] = "cn=$name,ou=addressbook,dc=mc03,dc=local";
	$res = ldap_mod_add($this->conn, $group_dn, $member);
	return $res;
    }

    public function del_from_group($group_name, $name){
	echo var_dump($group_name);
	echo var_dump($name);
	$group_dn = "cn=$group_name,ou=departs,dc=mc03,dc=local";
	$member['member'] = "cn=$name,ou=addressbook,dc=mc03,dc=local";
	$res = ldap_mod_del($this->conn, $group_dn, $member);
	return $res;
    }

    public function modify_list($list_name, $weidth){
	$list_dn = "cn=$list_name,ou=groups,dc=mc03,dc=local";
	if ($weidth !="" and $weidth != "0") {
	    $list['gidNumber'] = $weidth;
	} else {
	    $list['gidNumber'] = [];
	}
	$res = ldap_modify($this->conn, $list_dn, $list);
	return $res;
    }

    public function del_list($name){
	$list_dn = "cn=$name,ou=groups,dc=mc03,dc=local";
	$res = ldap_delete($this->conn, $list_dn);
	return $res;
    }
    
    public function add_to_list($list_name, $name){
	$list_dn = "cn=$list_name,ou=groups,dc=mc03,dc=local";
	$member['member'] = "cn=$name,ou=addressbook,dc=mc03,dc=local";
	$res = ldap_mod_add($this->conn, $list_dn, $member);
	return $res;
    }

    public function del_from_list($list_name, $name){
	$list_dn = "cn=$list_name,ou=groups,dc=mc03,dc=local";
	$member['member'] = "cn=$name,ou=addressbook,dc=mc03,dc=local";
	$res = ldap_mod_del($this->conn, $list_dn, $member);
	return $res;
    }

    
}


function convertFromProtocolDate($protocolDate, $format = 'long') {
    // Удаляем возможные пробелы и преобразуем в DateTime
    $cleanedDate = trim($protocolDate);
    $dateTime = DateTime::createFromFormat('YmdHis\Z', $cleanedDate);
    
    if (!$dateTime) {
        // Попробуем альтернативный формат без секунд
        $dateTime = DateTime::createFromFormat('YmdHi\Z', $cleanedDate);
        if (!$dateTime) {
            throw new InvalidArgumentException("Неверный формат protocolStartDate");
        }
    }
    
    //$dateTime->setTimezone(new DateTimeZone('UTC'));
    if($format == 'long'){
	return $dateTime->format('d.m.Y H:i:s');
    } elseif($format == 'short') {
	return $dateTime->format('H:i:s');
    }
}

/**
 * Возвращает дату 30 дней назад от текущей даты
 */

function getLdapDate30DaysAgo() {
    return (new DateTime('-30 days'))->format('YmdHis\Z');
}
