<?php

namespace App\Actions;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use App\Services\LdapService;
use App\View\Pages;

class LoginAction {
    private $ldap;
    private $view;

    public function __construct(LdapService $ldap, PAges $view)
    {
        $this->ldap = $ldap;
	$this->view = $view;
	
    }
    public function enter_page(ServerRequestInterface $request,
			       ResponseInterface $response, array $args): ResponseInterface
    {
	$operators = $this->ldap->operator_list();
	return $this->view->render($request, $response, 'login.html', [
	    'operators' => $operators
	]);
    }

    public function login(ServerRequestInterface $request,
			  ResponseInterface $response, array $args): ResponseInterface
    {
	$params = $request->getParsedBody();

	
	if(isset($params['name'])){
	    $name = $params['name'];
	    $pass = $params['pass'];
	    $login = $this->chech_pass($name, $pass); 
	    if ($login != false){
		$_SESSION['user'] = [];
		$_SESSION['user']['name'] = $name;
		if ($name == 'admin'){
		    $_SESSION['user']['role'] = 'admin';
		    $_SESSION['user']['username'] = 'admin';
		    $_SESSION['user']['employeetype'] = 'администратор';
		} else {
		    /* $operator = $this->conn->get_operator($name); */
		    /* $pass = $operator['password']; */
		    $_SESSION['user']['role'] = $login[0]['o'];
		    $_SESSION['user']['username'] = $login[0]['uid'];
		    $_SESSION['user']['employeetype'] = $login[0]['employeetype'];
		}
	    }
	    /* $view = Twig::fromRequest($request);
	       $operators = $conn->operator_list();
	       return $view->render($response, 'login.html', [
	       ]); */
	    return $response->withStatus(302)
			    ->withHeader('Location', "/ui");
	} else {
	    return $response->withStatus(302)
			    ->withHeader('Location', "/ui");
	    
	}

    }

    public function logout(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	unset($_SESSION['user']);
	return $response->withStatus(302)
			->withHeader('Location', "/ui");
	
    }

    private function chech_pass($userName, $pass){
	$ldapServer = $this->ldap->getHost();
	$ldapPort = 389;
	$baseDn = $this->ldap->getBase();
	if ($userName == "admin"){
	    $userDn = "cn=admin," . $baseDn;
	} else {
	    $userDn = "cn=".$userName.",ou=addressbook," . $baseDn;
	}
	$password = $pass;

	$login = false;
	// Подключение к LDAP-серверу
	$ldapConn = ldap_connect($ldapServer, $ldapPort);
	if (!$ldapConn) {
	    die("Не удалось подключиться к LDAP-серверу");
	}

	// Настройка параметров
	ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
	ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);

	// Попытка привязки (аутентификации)
	$bind = ldap_bind($ldapConn, $userDn, $password);
	if ($bind) {
	    echo "Аутентификация успешна!";
	    // Здесь можно выполнять другие LDAP-запросы
	    // Например, поиск информации о пользователе

	    if ($userName == 'admin'){
		$login = true;
	    } else {
		$searchFilter = "(cn=$userName)";
		$result = ldap_search($ldapConn, $baseDn, $searchFilter);
		$entries = ldap_get_entries($ldapConn, $result);
		
		// Вывод информации о пользователе (кроме пароля)
		/* var_dump($this->ldapEntriesToDictionary($entries)); */

		$login = $this->ldapEntriesToDictionary($entries);
	    }
	} else {
	    echo "Аутентификация не удалась: " . ldap_error($ldapConn);
	}

	// Закрытие соединения
	ldap_unbind($ldapConn);
	return $login;
    }

    private  function ldapEntriesToDictionary(array $ldapEntries): array {
	$result = [];
	
	if (!isset($ldapEntries['count']) || $ldapEntries['count'] == 0) {
            return $result;
	}

	for ($i = 0; $i < $ldapEntries['count']; $i++) {
            $entry = $ldapEntries[$i];
            $item = ['dn' => $entry['dn'] ?? '']; // Сохраняем Distinguished Name

            foreach ($entry as $key => $value) {
		// Пропускаем числовые ключи и служебное поле 'count'
		if (is_int($key) || $key === 'count' || $key === 'dn') {
                    continue;
		}

		// Проверяем, является ли значение массивом
		if (is_array($entry[$key]) && isset($entry[$key]['count'])) {
                    if ($entry[$key]['count'] == 1) {
			$item[$key] = $entry[$key][0];
                    } else {
			// Копируем все значения кроме 'count'
			$item[$key] = array_filter($entry[$key], function($k) {
                            return !is_int($k) && $k !== 'count';
			}, ARRAY_FILTER_USE_KEY);
                    }
		} else {
                    // Если это не массив, сохраняем как есть
                    $item[$key] = $entry[$key];
		}
            }

            $result[] = $item;
	}

	return $result;
    }
    
    
}
