<?php

namespace App\Actions;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UploadedFileInterface;
use App\View\Pages;
use App\Model\UpdateImage;
use App\Model\SystemImage;

class UpdateAction 
{
    private $view;
    
    public function __construct(Pages $view)
    {
	$this->view = $view;
    }

    public function update(ServerRequestInterface $request,
			   ResponseInterface $response, array $args): ResponseInterface
    {
	/* $rauc_status = shell_exec('rauc status --detailed --output-format=json');
	   $status = json_decode($rauc_status, true); */
	/* echo var_dump($request); */
	$status = new SystemImage();
	$params = $request->getQueryParams();
	$update = [];
	if (isset($params['filename'])){
	    $filename = $params['filename'];
	    /* $update = json_decode(shell_exec("rauc --output-format=json info $filename"), true); */
	    $update = new UpdateImage($filename);
	}
	/* echo var_dump($status); */
	$update_files = glob("/tmp/*.rauc");
	/* $output = shell_exec('rauc --output-format=json info /tmp/mc03-media-12.rauc'); */
	return $this->view->render($request, $response, 'update.html', [
	    'status' => $status,
	    'update_files' => $update_files,
	    'update' => $update,
	    'filename' => $filename
	]);
    }

    public function load_image(ServerRequestInterface $request,
			       ResponseInterface $response): ResponseInterface
    {
	$directory = "/tmp";
	$uploadedFiles = $request->getUploadedFiles();
	/* $uploadedFiles = $request->getHe(); */
	echo var_dump($uploadedFiles);
	echo var_dump($_FILES);
	// handle single input with single file upload
	$uploadedFile = $uploadedFiles['update'];
	$error = $uploadedFile->getError();
	if ($error == UPLOAD_ERR_OK) {
	    echo "upload file OK";
	    $filename = $this->moveUploadedFile($directory, $uploadedFile);
	    echo $filename;
	    /* $response->getBody()->write('Uploaded: ' . $filename . '<br/>'); */
	} else {
	    echo "upload file ERROR";
	    echo var_dump($error);
	}
	$status = shell_exec('rauc status --detailed --output-format=json');
	/* $update = json_decode(
	   shell_exec("rauc --output-format=json info $directory/$filename"), true); */
	$update = new UpdateImage("$directory/$filename");
	return $response->withStatus(302)
			->withHeader('Location', "/ui/update");
    }

    public function update_image(ServerRequestInterface $request,
				 ResponseInterface $response, array $args): ResponseInterface
    {
	$params = $request->getParsedBody();
	if (isset($params['file'])){
	    $resp = shell_exec("sudo /var/www/cgi/update_release 2>&1 ".$params['file']);
	    $status = shell_exec('rauc status --detailed --output-format=json');
	    $status = json_decode($status, true);
	    return $this->view->render($request, $response, 'update_complete.html', [
		'resp' => $resp,
		'status' => $status
	    ]);
	} else {
	    return $response->withStatus(302)
			    ->withHeader('Location', "/ui/update");
	}
    }

    private function moveUploadedFile(string $directory, UploadedFileInterface $uploadedFile)
    {
	$filename = $uploadedFile->getClientFilename();
	//$extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION);

	// see http://php.net/manual/en/function.random-bytes.php
	//$basename = bin2hex(random_bytes(8));
	//$filename = sprintf('%s.%0.8s', $basename, $extension);

	$uploadedFile->moveTo($directory . DIRECTORY_SEPARATOR . $filename);

	return $filename;
    }

}
