<?php
require_once '../../config.php';
require_once '../medoo/medoo.php';
date_default_timezone_set( 'Europe/Warsaw' );
session_start();

$mdb = new medoo( [
                    'database_type' => 'mysql',
                    'database_name' => $database['name'],
                    'server'        => $database['host'],
                    'username'      => $database['user'],
                    'password'      => $database['password'],
                    'charset'       => 'utf8'
                ] );

header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate" );
header( "Cache-Control: post-check=0, pre-check=0", false );
header( "Pragma: no-cache" );

$fileDir    = '/upload/article_files/tmp';
$targetDir  = '../..' . $fileDir;

if ( !is_dir( $targetDir ) )
  mkdir( $targetDir, 0755, true );

$cleanupTargetDir = true;
$maxFileAge       = 5 * 3600;

$chunk            = isset( $_REQUEST["chunk"] ) ? intval( $_REQUEST["chunk"] ) : 0;
$chunks           = isset( $_REQUEST["chunks"] ) ? intval( $_REQUEST["chunks"] ) : 0;
$fileName         = isset( $_REQUEST["name"] ) ? $_REQUEST["name"] : '';

$fileName         = preg_replace( '/[^\w\._]+/', '_', $fileName );

if ( file_exists( $targetDir . DIRECTORY_SEPARATOR . $fileName ) ) 
{
	$ext        = strrpos( $fileName, '.' );
	$fileName_a = substr( $fileName, 0, $ext );
	$fileName_b = substr( $fileName, $ext );

	$count = 1;
  
	while ( file_exists( $targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b ) )
		$count++;

	$fileName = $fileName_a . '_' . $count . $fileName_b;
}

$filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;

if ( $cleanupTargetDir && is_dir( $targetDir ) && ( $dir = opendir( $targetDir ) ) ) 
{
	while ( ( $file = readdir( $dir ) ) !== false ) 
  {
		$tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file;

		if ( preg_match( '/\.part$/', $file ) && ( filemtime( $tmpfilePath ) < time() - $maxFileAge ) && ( $tmpfilePath != "{$filePath}.part" ) ) {
			@unlink( $tmpfilePath );
		}
	}

	closedir($dir);
} 
else
	die( '{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}' );

if ( isset( $_SERVER["HTTP_CONTENT_TYPE"] ) )
	$contentType = $_SERVER["HTTP_CONTENT_TYPE"];

if ( isset( $_SERVER["CONTENT_TYPE"] ) )
	$contentType = $_SERVER["CONTENT_TYPE"];

if ( strpos( $contentType, "multipart" ) !== false ) 
{
	if ( isset( $_FILES['file']['tmp_name'] ) && is_uploaded_file( $_FILES['file']['tmp_name'] ) ) 
  {
		$out = fopen( "{$filePath}.part", $chunk == 0 ? "wb" : "ab" );
		if ( $out ) 
    {
			$in = fopen( $_FILES['file']['tmp_name'], "rb" );

			if ( $in ) 
      {
				while ( $buff = fread( $in, 4096 ) )
					fwrite($out, $buff);
			} 
      else
				die( '{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}' );
			fclose( $in );
			fclose( $out );
			@unlink( $_FILES['file']['tmp_name'] );
		} 
    else
			die( '{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}' );
	} 
  else
		die( '{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}' );
} 
else 
{
	$out = fopen( "{$filePath}.part", $chunk == 0 ? "wb" : "ab" );
	if ( $out )
  {
		$in = fopen( "php://input", "rb" );

		if ( $in ) 
    {
			while ( $buff = fread( $in, 4096 ) )
				fwrite( $out, $buff );
		}
    else
			die( '{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}' );

		fclose( $in );
		fclose( $out );
	} 
  else
		die( '{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}' );
}

if ( !$chunks || $chunk == $chunks - 1 ) 
{
	rename( "{$filePath}.part", $filePath );
  
  $mdb -> insert( 'pp_articles_files', [ 
          'article_id' => null,
          'src' => substr( $filePath, 5, strlen( $filePath ) )
  ] );
  
  $file_id    = $mdb -> id();
  $file_name  = explode( '/', $filePath );
  $file_name  = $file_name[ count( $file_name ) - 1 ];
}

die( '{"jsonrpc" : "2.0", "result" : null, "id" : "id", "file_name" : "' . $file_name . '", "file_id" : "' . $file_id . '"}' );
?>