<?php

namespace App\Actions\Session;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Container\ContainerInterface;
use Slim\Views\Twig;
use App\Services\LdapService;
use App\Services\ApiService;
use App\Modules\FSAPI\DuplicatSessionException;
use App\Model\Session as S;
use App\Model\Call;
use App\View\Pages;
use App\Model\Exception\EmptyNumberException;
use App\Model\Exception\UserExistException;

class SessionAction
{

    private $ldap;
    private $rest;
    private $folder;
    private $defaults;
    private $status_code;
    private $view;
    
    public function __construct($config, LdapService $ldap, ApiService $api, Pages $view)
    {
	$this->ldap = $ldap;
	$this->rest = $api;
	$this->folder = $config['media']['folder'];
	$this->defaults = $config['defaults'];
	$this->status_code = $config['call_status'];
	$this->view = $view;
	/* parent::__construct(); */
    }

    private function active_session(){
	$sessions = $this->rest->session();
	return $sessions;
    }
    
    private function session_info($uuid){
	$session = $this->rest->session_info($uuid);
	return $session;
    }

    private function session_update($uuid, $data){
	$response = $this->rest->session_update($uuid, $data);
	return $response;
    }
    
    public function status(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	$params = $request->getQueryParams();
	$current_session = $this->active_session();

	$temp_files =  glob("$this->folder/*.wav");
	$files=[];
	/* echo var_dump($temp_files); */
	foreach ($temp_files as $f){
	    $files[] = $f;
	};
	$media = [];
	foreach ($files as $file){
	    $media[] = basename($file);
	}
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$temp_users = [];

	if(isset($params['state'])){
	    if($params['state'] == 'active' ){
		if($session->status == "active") {
		    return $this->view->render($request, $response, 'session/active_calls.html', [
			'session' => $session,
			'status_code' => $this->status_code
		    ]);
		} else {
		    return $response->withStatus(301);
		}

	    }
	} else {
	    return $this->view->render($request, $response, 'session/main.html', [
		'session' => $session,
		'media' => $media,
		'current_session' => $current_session,
		'currentPath' => $_SERVER['REQUEST_URI'],
		'status_code' => $this->status_code
	    ]);
	}
    }

    public function config(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	$current_session = $this->active_session();
	$temp_files =  glob("$this->folder/*.wav");
	$files=[];
	foreach ($temp_files as $f){
	    $files[] = $f;
	};
	$media = [''];
	foreach ($files as $file){
	    $media[] = basename($file);
	}
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	/* echo var_dump($session); */
	return $this->view->render($request, $response, 'session/config.html', [
	    'session' => $session,
	    'media' => $media,
	    'current_session' => $current_session,
	    'currentPath' => $_SERVER['REQUEST_URI'],
	    'status_code' => $this->status_code
	]);
    }

    public function update_config(ServerRequestInterface $request,
				  ResponseInterface $response, array $args): ResponseInterface
    {
	$uuid = $args['uuid'];
	$params = $request->getParsedBody();
	$newname = explode(' ', $params['name']);
	$newname = implode('_', $newname);
	$data['name'] = $newname;
	if($params['media']){
	    $data['media'] = $this->folder."/".$params['media'];
	}
	else{
	    $data['media'] = "/tmp/".$uuid.".wav";
	}
	$data['anonce'] = $this->folder."/".$params['anonce'];
	$data['parallel'] = $params['parallel'];
	$data['repeate'] = $params['repeate'];
	$data['pause'] = $params['pause'];
	$data['pattern'] = $params['pattern'];
	$data['from_user'] = $params['number_from'];
	$data['number_for_record'] = $params['number_for_record'];

	$resp = $this->session_update($uuid, $data);
	$_SESSION['message'][] = ["настройки успешно применены", 'info'];
	/* echo var_dump($resp); */
	return $this->view->redirect($response, "/ui/session/".$uuid);
    }

    public function dict(ServerRequestInterface $request,
			 ResponseInterface $response, array $args): ResponseInterface
    {
	$current_session = $this->active_session();
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$groups = $this->ldap->search_departs("*");

	$params = $request->getQueryParams();
	if (isset($params['query']) AND $params['query']!=''){
	    $query = $params['query'];
	} else {
	    $query = '*';
	}
	return $this->view->render($request, $response, 'session/dict.html', [
	    'session' => $session,
	    'departs' => $groups,
	    'query' => $query,
	    'current_session' => $current_session,
	    'currentPath' => $_SERVER['REQUEST_URI'],
	    'status_code' => $this->status_code
	]);
    }

    public function depart(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	$current_session = $this->active_session();
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$depart_name = $args['depart'];
	$depart = $this->ldap->get_depart($depart_name);

	return $this->view->render($request, $response, 'session/depart.html', [
	    'session' => $session,
	    'depart' => $depart,
	    'depart_name' => $depart_name,
	    'current_session' => $current_session,
	    'currentPath' => $_SERVER['REQUEST_URI'],
	    'status_code' => $this->status_code
	]);
    }

    public function search(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	$current_session = $this->active_session();
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$params = $request->getQueryParams();
	if (isset($params['query'])) {
	    if($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){
		    [$g['name'] => $val] = $this->ldap->get_depart($g['name']);
		    $info[$g['name']] = $val;
		}
	    }

	    return $this->view->render($request, $response, 'session/search.html', [
		'session' => $session,
		'search' => $info,
		'query' => $query,
		'current_session' => $current_session,
		'currentPath' => $_SERVER['REQUEST_URI'],
		'status_code' => $this->status_code
	    ]);
	} else {
	    return $this->view->render($request, $response, 'session/search_form.html', [
		'session' => $session,
	    ]);
	}
    }


    public function groups(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	$current_session = $this->active_session();
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$groups = $this->ldap->search_groups('*');

	return $this->view->render($request, $response, 'session/groups.html', [
	    'session' => $session,
	    'groups' => $groups,
	    'current_session' => $current_session,
	    'currentPath' => $_SERVER['REQUEST_URI'],
	    'status_code' => $this->status_code
	]);
    }

    public function group(ServerRequestInterface $request,
			  ResponseInterface $response, array $args): ResponseInterface
    {
	$current_session = $this->active_session();
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$group_name = $args['group'];
	$group = $this->ldap->get_group($group_name);

	return $this->view->render($request, $response, 'session/group.html', [
	    'session' => $session,
	    'group' => $group,
	    'current_session' => $current_session,
	    'currentPath' => $_SERVER['REQUEST_URI'],
	    'status_code' => $this->status_code
	]);
    }

    public function subscriber(ServerRequestInterface $request,
			       ResponseInterface $response, array $args): ResponseInterface
    {
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$params = $request->getParsedBody();
	if(isset($params['add']))
	{
	    $subscriber_name = $params['add'];

	    try
	    {
		$this->add_subscriber($session, $subscriber_name);
		/* $_SESSION['message'][] = [$subscriber_name." успешно добавлен",
		   'info']; */
	    }
	    catch(EmptyNumberException $ex){
		/* $_SESSION['message'][] = [$ex->getMessage()." отсутствует номер",
		   'error']; */
	    }
	    catch(UserExistException $ex){
		/* $_SESSION['message'][] = [$ex->getMessage()." уже добавлен",
		   'error']; */
	    }
	} elseif(isset($params['remove']))
	{
	    $subscriber_name = $params['remove'];
	    $this->remove_subscriber($session, $subscriber_name);
	    /* $_SESSION['message'][] = [$subscriber_name." успешно удален",
	       'info']; */
	}
	/* echo var_dump($currentPath); */
	$from = $request->getHeader('Referer');
	return $this->view->redirect($response, $from);
	/* return $this->view->render($request, $response, 'session/group.html', [
	   'session' => $session,
	   'currentPath' => $_SERVER['REQUEST_URI'],
	   'status_code' => $this->status_code
	   ]); */
    }

    public function add_group(ServerRequestInterface $request,
			      ResponseInterface $response, array $args): ResponseInterface
    {
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$params = $request->getParsedBody();
	if(isset($params['add']))
	{
	    $group_name = $params['add'];
	    $group = $this->ldap->get_group($group_name);
	    $users = $group[$group_name];
	    foreach($users as $user){
		try
		{
		    $this->add_subscriber($session, $user['cn'][0]);
		    /* $_SESSION['message'][] = [$user['cn'][0]." успешно добавлен",
		       'info']; */
		}
		catch(EmptyNumberException $ex){
		    /* $_SESSION['message'][] = [$ex->getMessage()." отсутствует номер",
		       'error']; */
		}
		catch(UserExistException $ex){
		    /* $_SESSION['message'][] = [$ex->getMessage()." уже добавлен",
		       'error']; */
		}
	    }
	} elseif(isset($params['remove']))
	{
	    $group_name = $params['remove'];
	    $group = $this->ldap->get_group($group_name);
	    $users = $group[$group_name];
	    foreach($users as $user){
		$this->remove_subscriber($session, $user['cn'][0]);
		/* $_SESSION['message'][] = [$user['cn'][0]." успешно удален",
		   'info']; */
	    }
	}
	/* echo var_dump($currentPath); */
	$from = $request->getHeader('Referer');
	return $this->view->redirect($response, $from);
	/* return $this->view->render($request, $response, 'session/group.html', [
	   'session' => $session,
	   'currentPath' => $_SERVER['REQUEST_URI'],
	   'status_code' => $this->status_code
	   ]); */
    }

    public function add_depart(ServerRequestInterface $request,
			       ResponseInterface $response, array $args): ResponseInterface
    {
	$uuid = $args['uuid'];
	$session = $this->session_info($uuid);
	$params = $request->getParsedBody();
	if(isset($params['add']))
	{
	    $depart_name = $params['add'];
	    $depart = $this->ldap->get_depart($depart_name);
	    $users = $depart[$depart_name];
	    foreach($users as $user){
		try
		{
		    $this->add_subscriber($session, $user['cn'][0]);
		    /* $_SESSION['message'][] = [$user['cn'][0]." успешно добавлен",
		       'info']; */
		}
		catch(EmptyNumberException $ex){
		    /* $_SESSION['message'][] = [$ex->getMessage()." отсутствует номер",
		       'error']; */
		}
		catch(UserExistException $ex){
		    /* $_SESSION['message'][] = [$ex->getMessage()." уже добавлен",
		       'error']; */
		}
	    }
	} elseif(isset($params['remove']))
	{
	    $depart_name = $params['remove'];
	    $depart = $this->ldap->get_depart($depart_name);
	    $users = $depart[$depart_name];
	    foreach($users as $user){
		$this->remove_subscriber($session, $user['cn'][0]);
		/* $_SESSION['message'][] = [$user['cn'][0]." успешно удален",
		   'info']; */
	    }
	}
	/* echo var_dump($currentPath); */
	$from = $request->getHeader('Referer');
	return $this->view->redirect($response, $from);
	/* return $this->view->render($request, $response, 'session/group.html', [
	   'session' => $session,
	   'currentPath' => $_SERVER['REQUEST_URI'],
	   'status_code' => $this->status_code
	   ]); */
    }
    
    
    private function add_subscriber($session, $name){
	$subscriber = $this->ldap->get_user($name);
	$depart = $this->ldap->search_depart_by_member($name);
	/* $user['name' => $subscriber['cn'][0],
	   'name' => $subscriber['cn'][0],
	   ] */
	if(isset($subscriber['w'])){
	    $weidth = $subscriber['w'];
	} else {
	    $weidth = 999;
	}
	$user = [$subscriber['cn'][0],
             $subscriber['employeetype'][0] ?? "",
             $subscriber['mobile'][0],
             $depart[0]['name'],
             $weidth];
	$session->add_subscriber($user);
	$resp = $this->session_update($session->uuid,
				      ['numbers' => $session->numbers,
				       'meta' => $session->meta]);
    }

    private function remove_subscriber($session, $name){
	$session->remove_subscriber($name);
	$resp = $this->session_update($session->uuid,
				      ['numbers' => $session->numbers,
				       'meta' => $session->meta]);
    }
    
    // Вынесено в модуль GetSessionListAction
    /* public function get(ServerRequestInterface $request,
       ResponseInterface $response, array $args): ResponseInterface
     * {
       $users = [];
       if(isset($_SESSION['select'])){
       foreach ($_SESSION['select'] as $user => $val){
       $users[] = $user;
       }
       }
       $data = $this->ldap->get_users($users);
       $session = [];
       foreach ($data as $u){
       $session[$_SESSION['select'][$u['cn'][0]]][] = $u;
       }
       $current_session = $this->active_session();
       return $this->view->render($request, $response, 'session.html', [
       'data' => $data,
       'groups' => [],
       'current_session' => $current_session,
       'currentPath' => $_SERVER['REQUEST_URI']
       ]);
     * } */

    public function start(ServerRequestInterface $request,
			  ResponseInterface $response, array $args): ResponseInterface
    {
	$uuid = $args['uuid'];
	$params = $request->getParsedBody();
	/* $api = new FSAPI($this->rest); */
	if (isset($params['start'])){
	    $current_session = $this->rest->start_session($uuid);
	    return $this->view->redirect($response, "/ui/session/$uuid");
	} elseif(isset($params['close'])){
	    $current_session = $this->rest->stop_session($uuid);
	    return $response->withStatus(302)->withHeader('Location', "/ui/session");
	} elseif(isset($params['stop'])){
	    $current_session = $this->rest->stop_session($uuid);
	    return $response->withStatus(302)->withHeader('Location', "/ui/session/$uuid");
	} elseif(isset($params['restart'])){
	    /* echo var_dump($params['numbers']); */
	    $data['numbers'] = $params['numbers'];
	    $current_session = $this->rest->restart_session($uuid, $data);
	    return $response->withStatus(302)->withHeader('Location', "/ui/session/$uuid");
	}
	elseif(isset($params['report'])){
	    return $response->withStatus(302)->withHeader('Location', "/ui/report/$uuid");
	}
	elseif(isset($params['archive'])){
	    return $response->withStatus(302)->withHeader('Location', "/ui/archive");
	}
    }

    public function test_call(ServerRequestInterface $request,
			      ResponseInterface $response, array $args): ResponseInterface
    {
	$params = $request->getQueryParams();
	$media = $params['media'];
	$anonce = $params['anonce'];
	/* $media = "message.wav"; */
	/* $api = new FSAPI($this->rest); */
	$filename = $this->defaults['phrase'];
	$number = $params['test_number'];
	
	if(($fp = fopen($filename, 'r')) !== FALSE){
	    while (($tmp = fgetcsv($fp, 100, ",")) !== FALSE) {
		$actions[] = [$tmp[0] => $tmp[1]];
	    }	} else {
		$actions[] = [['play' => 'anonce'],
			      ['sleep' => '1000'],
			      ['play' => 'message']];
	    };

	$data['actions'] = $actions;
	$data['from_user'] = $params['number_from'];
	$data['number'] = $number;
	$data['name'] = $media;
	$data['anonce'] = $anonce;
	$this->rest->test_call($data);
	/* echo var_dump($data); */
	$response->getBody()->write("start test call");
	return $response;
    }
}
