<?php

namespace App\Actions\Phonebook;

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

class BookAction
{
    private LdapService $ldap;
    private Pages $view;
    
    public function __construct(LdapService $ldap, Pages $view)
    {
        $this->ldap = $ldap;
	$this->view = $view;
    }
    public function get_user(ServerRequestInterface $request,
			     ResponseInterface $response, array $args): ResponseInterface
    {
	/* $view = Twig::fromRequest($request); */
	/* $view = new Pages($request); */
	$name = $args['name'];
	$params = $request->getQueryParams();
	// $depart['name'] = $params['depart'];
	
	if ($name == 'new'){
            $user['employeetype'][] = "";
            $user['departs'] = 	$groups = $this->ldap->search_departs("*");
            $user['w'] = 100;
            $user['mobile'][] = "";
	} else {
            $user = $this->ldap->get_user($name);
            $user['departs'] = 	$groups = $this->ldap->search_departs("*");
            $d = $this->ldap->search_depart_by_member($name);
            if ($d != []){
		$depart = $d[0];
            }
	}
	// echo var_dump($user['departs']);
	$lists = $this->ldap->group_list();
	
	return $this->view->render($request, $response, 'user_form.html', [
            'name' => $name,
            'data' => $user,
            'lists' => $lists,
            'depart' => $depart
	]);
    }

    public function edit_user(ServerRequestInterface $request,
			      ResponseInterface $response, array $args): ResponseInterface
    {
	$name = $args['name'];
	$data = $request->getParsedBody();
        $user['cn'] = $data['cn']; 
	
	$user['employeetype'] = $data['employeetype'];
	if ($data['w']){
	    $user['uidNumber'] = $data['w'];
	}
	$user['mobile'] = [];
	$user['depart'] = $data['depart'];
	foreach ($data['mobile'] as $mob){
	    if($mob){
		$user['mobile'][] = $mob;
	    }
	}
	$headers = $request->getHeaders();
	$url = $headers['Referer'];
	if ($name == 'new'){
            $res = $this->ldap->insert_user1($user);
            if ($res) {
		$this->ldap->add_to_group($user['depart'], $user['cn']);
            }
            echo var_dump($res);
            $cn = $user['cn'];
            return $response->withStatus(302)
			    ->withHeader('Location', $url);
	} else {
            $d = $this->ldap->search_depart_by_member($name);
            if ($d != []){
		$depart = $d[0]['name'];
            }
            if ($user['depart'] != $depart) {
		$this->ldap->del_from_group($depart, $user['cn']);
		$this->ldap->add_to_group($user['depart'], $user['cn']);
            }
            $res = $this->ldap->update_user($name, $user);
            echo var_dump($res);
            return $response->withStatus(302)
			    ->withHeader('Location', $url);
	}
	
    }

    public function del_user(ServerRequestInterface $request,
			     ResponseInterface $response, array $args): ResponseInterface
    {
        $name = $args['name'];
        $res = $this->ldap->del_user($name);
        
        return $view->render($response, 'user.html', [
            'name' => $name
        ]);
    }

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

        $name = $params['depart_name'];
        $prio = $params['depart_prio'];

        $data['name'] = $name;
        if($prio){
            $data['prio'] = $prio;
        }
        $insert = $this->ldap->create_depart($data);
	
        $groups = $this->ldap->search_groups('*');
        return $response->withStatus(302)
			->withHeader('Location', "/ui/dict");
    }
    
    public function modify_depart(ServerRequestInterface $request,
				  ResponseInterface $response, array $args): ResponseInterface
    {
        $params = json_decode($request->getBody(), true);
        $list_name = $params['name'];
        $prio = $params['weidth'];
        $res = $this->ldap->modify_group($list_name, $prio);

        $response->getBody()->write("ok");
        return $response;
	
    }

    public function update_depart(ServerRequestInterface $request,
				  ResponseInterface $response, array $args): ResponseInterface
    {
        $params = $request->getParsedBody();
        $depart_name = $args['name'];
	$new_depart_name = $params['depart_name'];
        $prio = $params['depart_prio'];
        $res = $this->ldap->update_group($depart_name, $new_depart_name, $prio);
        return $this->redirect($response, "/ui/dict/$new_depart_name");
	
    }
    
    public function del_depart(ServerRequestInterface $request,
			       ResponseInterface $response, array $args): ResponseInterface
    {
        $name = $args['name'];
        $res = $this->ldap->del_group($name);
        $response->getBody()->write("ok");
    }
    
    public function depart(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	$params = $request->getQueryParams();
	$name = $args['name'];
	$depart = $this->ldap->get_depart($name);
	$params = $request->getQueryParams();
	if (isset($params['query']) AND $params['query']!=''){
	    $query = $params['query'];
	} else {
	    $query = '*';
	}
	/* $groups = $this->ldap->search_departs($query); */
	[$name => $users] = $depart;
	foreach($this->ldap->search_departs($name) as $g){
	    if($g['name'] == $name){
		$meta = $g;
	    }
	}
    if(isset($params['format'])){
        if($params['format'] == "departlist"){
            return $this->view->render($request, $response, "dict_modal.html",
                                       [  'data' => $depart,
                                          'meta' => $meta,
                                          /* 'groups' => $groups, */
                                          'session' => $_SESSION,
                                          'query' => $query]);
	    
        }}
	
	return $this->view->render($request, $response, "dict.html",
			     [  'data' => $depart,
				'meta' => $meta,
				/* 'groups' => $groups, */
				'session' => $_SESSION,
				'query' => $query]);
    }


    public function departs(ServerRequestInterface $request,
			    ResponseInterface $response, array $args): ResponseInterface
    {
	$params = $request->getQueryParams();
	$groups = $this->ldap->search_departs("*");
    if(isset($params['format'])){
        if($params['format'] == "departlist"){
            return $this->view->render($request, $response, "departs_modal.html",
                                       [ 'groups' => $groups,
                                         'session' => $_SESSION ]);
	    
        }} else {
	    return $this->view->render($request, $response, "departs.html",
				 [ 'groups' => $groups,
				   'session' => $_SESSION ]);
	}
	/* return $view->render($response, 'departs.html', [
	   'groups' => $groups,
	   'session' => $_SESSION
	   ]); */
    }
    
    
    public function search(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	$params = $request->getQueryParams();
	if (isset($params['query']) AND $params['query']!=''){
	    $query = $params['query'];
	} else {
	    $query = '*';
	}

	$info = $this->ldap->search($query);
	$groups = $this->ldap->search_departs($query);

	if ($info == [] AND $groups != []){
	    foreach($groups as $g){
		$temp = $this->ldap->get_depart($g['name']);
		$info[$g['name']] = $temp[$g['name']]; 
	    }
	}

	/* echo var_dump($info); */
	
	if (isset($_SESSION['count'])) {
	    $_SESSION['count'] = $_SESSION['count'] + 1;
	} else {
	    $_SESSION['count'] = 0;
	}
	$_SESSION['test'] = "asdad";
	
	$res = array();
	$i = 0;
	foreach ($info as $key => $elt) {
	    /* echo var_dump($elt);
	       echo "----\n";
	       if (isset($elt['mobile'])){
	       $elt['mobile'] = $this->phoneConvert($elt['mobile']);
	       }
	       
	       /* if (isset($elt['ou'])) {
	       foreach ($elt['ou'] as $ou) {
	       unset($elt['ou']);
	       $res[$ou][] = $elt;
	       }
	       } else {
	       $res['другие'][] = $elt;
	       } */

	}
	return $this->view->render($request, $response, 'dict_search.html', [
	    'data' => $info,
	    'groups' => $groups,
	    'session' => $_SESSION,
	    'query' => $query
	]);
	
    }

    public function export_load_file(ServerRequestInterface $request,
				     ResponseInterface $response, array $args): ResponseInterface
    {

	$params = $request->getQueryParams();
	if (isset($params['file'])){
	    
	    $filename = $params['file'];
	    $users = get_data($filename);
	    $groups = get_group_list($filename);
	    $custom_list = get_custom_list($filename);
	    /* echo var_dump($groups); */
	    foreach ($users['phonedir'] as $key => $val){
		foreach($val as $usr){
		    $this->ldap->insert_user($usr);
		}
	    }

	    foreach ($groups as $key => $val){
		$this->ldap->insert_group($key, $val);
	    }
	    foreach ($custom_list as $key => $val){
		$this->ldap->insert_list($key, $val);
	    }
	    return $this->view->render($request, $response, 'export.html', ['filename' => $filename]);
	} else {
	    return $this->view->render($request, $response, 'export.html', [ ]);
	}
    }

    public function export_parse_file(ServerRequestInterface $request,
				      ResponseInterface $response, array $args): ResponseInterface
    {
	$directory = "/tmp";
	$uploadedFiles = $request->getUploadedFiles();

	// handle single input with single file upload
	$uploadedFile = $uploadedFiles['phones'];
	if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
	    $filename = moveUploadedFile($directory, $uploadedFile);
	    $response->getBody()->write('Uploaded: ' . $filename . '<br/>');
	}
	$data = get_data($filename);
	$data['filename'] = $filename;
	/* echo var_dump($phonedir); */
	return $this->view->render($request, $response, 'export.html', $data);
    }

    
    private function phoneConvert($phones){
	
	$regexp = '/^(\+[0-9]{3})([0-9]{2})([0-9]{3})([0-9]{2})([0-9]{2})$/';
	$resp = [];
	foreach ($phones as $ph){
	    $match = array();
	    if (preg_match($regexp, $ph, $match)){
		$resp[] = "$match[1]-($match[2])-xxx-xx-$match[5]";
	    } else {
		$resp[] = $ph;
	    }
	}
	return $resp;
    }
    
}


function moveUploadedFile(string $directory, UploadedFileInterface $uploadedFile)
{
    $filename = $uploadedFile->getClientFilename();
    $uploadedFile->moveTo($directory . DIRECTORY_SEPARATOR . $filename);

    return $filename;
}

function get_data($filename){
    $db = new SQLite3("/tmp/".$filename);
    $q = 'SELECT u.id, g.group_name, p.poss_name, u.first_name, u.second_name, u.family_name, u.numbers, clist.gr
FROM phonedir as dir
LEFT JOIN (select u1.id, u1.first_name, u1.second_name, u1.family_name, group_concat(ph.number, \';\') numbers
from users as u1
left join phones as ph on ph.user_id_id = u1.id
group by u1.id) as u 
on u.id = dir.user_id_id
left join (select c.record_id_id id, group_concat(list.list_name, \';\') gr
from customlist as c
left join list on list_id_id = list.id group by record_id_id) as clist on clist.id = dir.user_id_id
left join possitions as p on poss_id_id = p.id
left join "group" as g on group_id_id = g.id;';

    $result = $db->query($q);

    $count = 0;
    $phonedir = [];
    $custom_list = [];
    while ($row = $result->fetchArray()) {
	$count = $count + 1;
	$groups = explode(';', $row['gr']);
	$phonedir[$row['group_name']][] =
	    array("name" => $row['first_name'],
		  "family" => $row['family_name'],
		  "second" => $row['second_name'],
		  "poss" => $row['poss_name'],
		  "numbers" => explode(';', $row['numbers']),
		  "lists" => $groups);
	foreach ($groups as $l){
	    $custom_list[$l][] = array("name" => $row['first_name'],
				       "family" => $row['family_name'],
				       "second" => $row['second_name']);
	}
    }
    $db->close();
    return $data = ['phonedir' => $phonedir, 'custom_list' => $custom_list];
}



function get_custom_list($filename) {
    $db = new SQLite3("/tmp/".$filename);
    $q = 'select list.list_name, u.family_name, u.first_name, u.second_name from customlist as c
left join list on c.list_id_id = list.id
left join phonedir as p on p.id = c.record_id_id
left join users as u on u.id = p.user_id_id;';
    $result = $db->query($q);
    
    $count = 0;
    $groups = [];
    while ($row = $result->fetchArray()) {
	$groups[$row['list_name']][] = array("name" => $row['first_name'],
					     "family" => $row['family_name'],
					     "second" => $row['second_name']);
    }
    return $groups;
    
}

function get_group_list($filename) {
    $db = new SQLite3("/tmp/".$filename);
    $q = 'select g.group_name, u.family_name, u.first_name, u.second_name from "group" as g
left join phonedir as p on p.group_id_id = g.id
left join users as u on u.id = p.user_id_id;';
    $result = $db->query($q);
    
    $count = 0;
    $groups = [];
    while ($row = $result->fetchArray()) {
	$groups[$row['group_name']][] = array("name" => $row['first_name'],
					      "family" => $row['family_name'],
					      "second" => $row['second_name']);
    }
    return $groups;
}

function get_user_list($filename) {
    $q = 'select u1.id, u1.first_name, u1.second_name, u1.family_name, group_concat(ph.number, \';\') numbers
from users as u1
left join phones as ph on ph.user_id_id = u1.id
group by u1.id';
    
}
