<?php
$before = microtime(true); // Start time of the script
error_reporting(E_ERROR); // Hide PHP errors
header('Content-type:application/json;charset=utf-8'); // Set the content type to JSON

/**
 * Configuration
 */
$tokens = array("set me"); // Your secret keys
$uploadDir = "./"; // The upload directory
$useRandomFileNames = false; // Use random file names instead of the original file name
$fileNameLength = 8; // The length of the random file name

/**
 * Check if the token is valid
 */
function checkToken($token): bool {
  global $tokens;
  return isset($token) && in_array($token, $tokens);
}

/**
 * Generate a random string
 */
function generateRandomString($length = 10): string {
  $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $charactersLength = strlen($characters);
  $randomString = '';
  for ($i = 0; $i < $length; $i++) {
    $randomString .= $characters[rand(0, $charactersLength - 1)];
  }
  return $randomString;
}

/**
 * Return a JSON response
 */
function returnJson($status, $message, $timeTaken = null): void {
  $json = array('status' => $status, 'url' => $message, 'processingTime' => round($timeTaken ?? 0, 2) . "ms");
  echo(json_encode($json));
  die();
}

try {
  $token = $_POST['secret']; // The provided secret key
  $file = $_FILES['sharex']; // The uploaded file

  // Check if the token is valid
  if (!checkToken($token)) {
    $timeTaken = microtime(true) - $before;
    returnJson('ERROR', 'Invalid or missing secret key', $timeTaken);
    die();
  }

  // Check if the file was uploaded
  if (!isset($file)) {
    $timeTaken = microtime(true) - $before;
    returnJson('ERROR', 'No file was uploaded', $timeTaken);
    die();
  }

  $target_file = $_FILES["sharex"]["name"]; // File name
  $fileType = pathinfo($target_file, PATHINFO_EXTENSION); // File extension (e.g. png, jpg, etc.)

  // Check if the file already exists
  if (file_exists($uploadDir . $target_file)) {
    $timeTaken = microtime(true) - $before;
    returnJson('ERROR', 'File already exists', $timeTaken);
    die();
  }

  $shouldSave = true; // Whether or not the file should be saved
  $finalName = $target_file; // The final name of the file
  if ($useRandomFileNames) { // Generate a random file name if enabled
    $finalName = generateRandomString($fileNameLength) . "." . $fileType;
  }

  // Convert the image to webp if applicable
  if (in_array($fileType, array("png", "jpeg", "jpg"))) {
    $image = imagecreatefromstring(file_get_contents($_FILES["sharex"]["tmp_name"]));
    $webp_file = pathinfo($finalName, PATHINFO_FILENAME) . ".webp";
    imagewebp($image, $webp_file, 90); // Convert the image and save it
    imagedestroy($image); // Free up memory
    $finalName = $webp_file;
    $shouldSave = false;
  }

  if ($shouldSave) {
    // Move the file to the uploads folder
    if (move_uploaded_file($_FILES["sharex"]["tmp_name"], $uploadDir . $finalName)) {
      $timeTaken = microtime(true) - $before;
      returnJson('OK', $finalName, $timeTaken);
    } else {
      $timeTaken = microtime(true) - $before;
      returnJson('ERROR', 'File upload failed. Does the upload folder exist and did you CHMOD the folder?', $timeTaken);
    }
    die();
  }
  returnJson('OK', $finalName, $timeTaken);
} catch (Exception $e) { // Handle any errors
  $timeTaken = microtime(true) - $before;
  returnJson('ERROR', $e->getMessage(), $timeTaken);
  die();
}
?>