<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Slim\Views\Twig;
use Slim\Views\TwigMiddleware;
use Slim\Routing\RouteContext;
use Slim\Routing\RouteCollectorProxy;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\UploadedFileInterface;
use App\Middleware\LoginAuthMiddleware;
use Slim\Middleware\MethodOverrideMiddleware;

require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/config/dependencies.php';



/**
 * Instantiate App
 *
 * In order for the factory to work you need to ensure you have installed
 * a supported PSR-7 implementation of your choice e.g.: Slim PSR-7 and a supported
 * ServerRequest creator (included with Slim PSR-7)
 */

AppFactory::setContainer($container);

$app = AppFactory::create();


/**
 * The routing middleware should be added earlier than the ErrorMiddleware
 * Otherwise exceptions thrown from it will not be handled by the middleware
 */
// Parse json, form data and xml
$app->add(LoginauthMiddleware::class);
$app->addBodyParsingMiddleware();
$app->addRoutingMiddleware();
$app->add(new MethodOverrideMiddleware);
/* $twig = Twig::create('./public', ['cache' => false]); */

// TODO: убрать после рефакторинга. Twig должен передаваться как DI
/* $twig = $container->get('view');
 * $app->add(TwigMiddleware::create($app, $twig)); */


/* $app->add(\App\Middleware\RenderMiddleware::class); */

/**
 * Add Error Middleware
 *
 * @param bool                  $displayErrorDetails -> Should be set to false in production
 * @param bool                  $logErrors -> Parameter is passed to the default ErrorHandler
 * @param bool                  $logErrorDetails -> Display error details in error log
 * @param LoggerInterface|null  $logger -> Optional PSR-3 Logger  
 *
 * Note: This middleware should be added last. It will not handle any exceptions/errors
 * for middleware added after it.
 */
$errorMiddleware = $app->addErrorMiddleware(true, true, true);

$app->get('/ui/',  [App\Actions\MainAction::class, 'main']);
$app->get('/ui',   [App\Actions\MainAction::class, 'main']);
$app->get('/ui/dict',            [App\Actions\Phonebook\BookAction::class, 'departs']);
$app->get('/ui/dict/{name}',      [App\Actions\Phonebook\BookAction::class, 'depart']);
$app->get('/ui/search',       [App\Actions\Phonebook\BookAction::class, 'search']);

$app->group('/ui/user', function (RouteCollectorProxy $group){
    $group->get('/{name}',     [App\Actions\Phonebook\BookAction::class, 'get_user']);
    $group->get('/delete/{name}',  [App\Actions\Phonebook\BookAction::class, 'del_user']);
    $group->post('/{name}',     [App\Actions\Phonebook\BookAction::class, 'edit_user']); 
});

$app->group('/ui/depart', function (RouteCollectorProxy $group){
    $group->post('/new',  [App\Actions\Phonebook\BookAction::class, 'create_depart']);
    $group->post('/modify',   [App\Actions\Phonebook\BookAction::class, 'modify_depart']);
    $group->post('/update/{name}',  [App\Actions\Phonebook\BookAction::class, 'update_depart']);
    $group->get('/delete/{name}',  [App\Actions\Phonebook\BookAction::class, 'del_depart']);
});

$app->group('/ui/group', function (RouteCollectorProxy $group){
    $group->get('',           [App\Actions\Phonebook\GroupAction::class, 'get']);
    $group->get('/{name}',    [App\Actions\Phonebook\GroupAction::class, 'group']);
    $group->post('/new',     [App\Actions\Phonebook\GroupAction::class, 'new']);
    $group->post('/modify',  [App\Actions\Phonebook\GroupAction::class, 'list_modify']);
    $group->post('/{name}',   [App\Actions\Phonebook\GroupAction::class, 'add_to_list']);
    $group->get('/delete/{name}',   [App\Actions\Phonebook\BookAction::class, 'del_list']);
});

$app->group('/ui/export', function (RouteCollectorProxy $group){
    $group->get('',           [App\Actions\Phonebook\BookAction::class, 'export_load_file']);
    $group->post('',         [App\Actions\Phonebook\BookAction::class, 'export_parse_file']);
});

$app->group('/ui/session', function (RouteCollectorProxy $group){
    $group->get('',         App\Actions\Session\GetSessionListAction::class);
    $group->post('',        App\Actions\Session\CreateSessionAction::class);
    $group->get('/test_call',  [App\Actions\Session\SessionAction::class,'test_call']);
    $group->get('/{uuid}', [App\Actions\Session\SessionAction::class,'status']);
    $group->post('/{uuid}',  [App\Actions\Session\SessionAction::class,'start']);
    $group->get('/{uuid}/config', [App\Actions\Session\SessionAction::class,'config']);
    $group->post('/{uuid}/config',  [App\Actions\Session\SessionAction::class,'update_config']);
    $group->get('/{uuid}/dict', [App\Actions\Session\SessionAction::class,'dict']);
    $group->get('/{uuid}/dict/{depart}', [App\Actions\Session\SessionAction::class,'depart']);
    $group->get('/{uuid}/search', [App\Actions\Session\SessionAction::class,'search']);
    $group->get('/{uuid}/group', [App\Actions\Session\SessionAction::class,'groups']);
    $group->get('/{uuid}/group/{group}', [App\Actions\Session\SessionAction::class,'group']);
    $group->get('/{uuid}/report', [App\Actions\Session\ReportAction::class,'report']);
    $group->post('/{uuid}/subscriber',  [App\Actions\Session\SessionAction::class,'subscriber']);
    $group->post('/{uuid}/depart', [App\Actions\Session\SessionAction::class,'add_depart']);
    $group->post('/{uuid}/group', [App\Actions\Session\SessionAction::class,'add_group']);
    $group->get('/{uuid}/media', [App\Actions\Session\SessionAction::class,'media']);
});

$app->group('/ui/config', function (RouteCollectorProxy $group){
    $group->get('',              [App\Actions\Config\ConfigAction::class, 'get']);
    $group->get('/answer_code',  [App\Actions\Config\ConfigAction::class,'getAnswerCode']);
    $group->post('/answer_code', [App\Actions\Config\ConfigAction::class,'setAnswerCode']);
    $group->post('',            [App\Actions\Config\ConfigAction::class,'save']);
});

$app->group('/ui/media', function (RouteCollectorProxy $group){
    $group->get('',           [App\Actions\MediaAction::class, 'get']);
    $group->post('',          [App\Actions\MediaAction::class, 'upload']);
    $group->get('/delete/{name}', [App\Actions\MediaAction::class,'del']);
    $group->post('/record',  [App\Actions\MediaAction::class,'record']);
    $group->get('/express', [App\Actions\MediaAction::class, 'express']);
});


$app->get('/ui/phrase',  App\Actions\Phrase\PhraseAction::class);
$app->post('/ui/phrase', App\Actions\Phrase\PhraseAction::class);

$app->group('/ui/archive', function (RouteCollectorProxy $group){
    $group->get('',          [App\Actions\Session\ReportAction::class, 'archive_list']);
    $group->get('/{name}',         [App\Actions\Session\ReportAction::class,'archive_show']);
    $group->delete('/{name}',          [App\Actions\Session\ReportAction::class,'delete_archive']);
    $group->post('/{uuid}',  [App\Actions\Session\ReportAction::class,'archive']);
});

$app->get('/ui/update-date',     [App\Actions\MainAction::class, 'update_date']);
$app->get('/ui/state',            [App\Actions\MainAction::class, 'current_state']);
$app->get('/ui/report/{name}',   [App\Actions\Session\ReportAction::class,'report']);
$app->post('/ui/system/{cmd}',    [App\Actions\MainAction::class, 'system']);


$app->group('/ui/operator', function (RouteCollectorProxy $group){
    $group->get('',          [App\Actions\OperatorAction::class, 'list']);
    $group->get('/{name}',  [App\Actions\OperatorAction::class, 'edit']);
    $group->delete('/{name}',  [App\Actions\OperatorAction::class, 'delete']) ;
    $group->post('/{name}',          [App\Actions\OperatorAction::class, 'create']);
    /* $group->get('/delete/{name}', 'App\Modules\User\Operator:delete'); */
    
});


$app->get('/ui/login', [App\Actions\LoginAction::class, 'enter_page']);
$app->post('/ui/login', [App\Actions\LoginAction::class,'login']);
$app->get('/ui/logout', [App\Actions\LoginAction::class, 'logout']);


$app->post('/ui/select', 'App\Modules\Action\Action:select');

$app->get('/ui/update',        [App\Actions\UpdateAction::class, 'update']);
$app->post('/ui/update',       [App\Actions\UpdateAction::class, 'load_image']);
$app->post('/ui/update/image', [App\Actions\UpdateAction::class, 'update_image']);

$app->get('/ui/update/restart', function (Request $request, Response $response, $args) {
    $params = $request->getParsedBody();
    $resp = shell_exec("sudo /var/www/cgi/update_restart 2>&1 ");

    return $response->withStatus(302)
		    ->withHeader('Location', "/ui");
});

$app->post('/uids/export', function (Request $request, Response $response, $args) {
    $view = Twig::fromRequest($request);
    $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/>');
    }

    $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();
    /* echo var_dump($phonedir); */
    return $view->render($response, 'export.html',
			 [ 'phonedir' => $phonedir,
			   'custom_list' => $custom_list,
			   'filename' => $filename
    ]);
});


function fs_link($addr) {
    return '/' . $addr;
}

function renderTemplate($request, $response, $template, $data) {
    $view = Twig::fromRequest($request);
    date_default_timezone_set("Europe/Minsk");
    $data['current_date'] = date("d-m-Y H:i:s");
    return $view->render($response, $template, $data);
}

// Run app
$app->run();

