<?php
// etch-receive.php — приёмник гравюр Etching от Heroku (foto-d3-new).
// Кладёт картинку в static.fotoaward.org/etching/ и возвращает публичный URL.
// Авторизация: HMAC-SHA256(name:exp, FA_ETCH_KEY), окно ±900с.

// --- вывод только JSON, никаких warning в тело ответа ---
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
header('Content-Type: application/json; charset=utf-8');

function out($arr, $code = 200) {
  http_response_code($code);
  echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
  exit;
}
function fail($msg) { out(['ok' => false, 'error' => $msg], 400); }

require '/home/fotozmln/fa-secrets.php';
if (!defined('FA_ETCH_KEY')) fail('server');

// --- только POST ---
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') fail('method');

// --- поля ---
$name = (string)($_POST['name'] ?? '');
$exp  = (string)($_POST['exp']  ?? '');
$token= (string)($_POST['token']?? '');
if ($name === '' || $exp === '' || $token === '') fail('fields');

// --- чистка имени: только латиница/цифры/дефис/подчёркивание, ни точек ни слэшей ---
$clean = preg_replace('/[^a-z0-9_\-]/', '', strtolower($name));
if ($clean === '' || strlen($clean) > 80) fail('name');

// --- подпись: считаем от ИСХОДНОГО name и exp как строк, ровно как прислано ---
$calc = hash_hmac('sha256', $name . ':' . $exp, FA_ETCH_KEY);
if (!hash_equals($calc, $token)) fail('auth');

// --- срок: exp как строка -> целое, окно в обе стороны 900с ---
if (!preg_match('/^\d{1,15}$/', $exp)) fail('exp');
$expNum = (int)$exp;
if (abs(time() - $expNum) > 900) fail('expired');

// --- файл ---
if (!isset($_FILES['file']) || ($_FILES['file']['error'] ?? 1) !== UPLOAD_ERR_OK) fail('no file');
$sz = (int)($_FILES['file']['size'] ?? 0);
if ($sz <= 0 || $sz > 5 * 1024 * 1024) fail('size');
$tmp = $_FILES['file']['tmp_name'];

// --- тип по реальному содержимому, не по заголовку/расширению ---
$info = @getimagesize($tmp);
if ($info === false) fail('not image');
$mime = $info['mime'] ?? '';
$extMap = ['image/png' => 'png', 'image/jpeg' => 'jpg', 'image/webp' => 'webp'];
$ext = $extMap[$mime] ?? '';
if ($ext === '') fail('type');

$DIR = '/home/fotozmln/static.fotoaward.org/etching';
$BASE_URL = 'https://static.fotoaward.org/etching/';

// --- дедуп: файл с этим базовым именем и ЛЮБЫМ из трёх расширений уже есть? ---
foreach (['png', 'jpg', 'webp'] as $e) {
  if (is_file("$DIR/$clean.$e")) {
    out(['ok' => true, 'url' => $BASE_URL . $clean . '.' . $e]);
  }
}

// --- сохраняем ---
$dest = "$DIR/$clean.$ext";
if (!@move_uploaded_file($tmp, $dest)) fail('write');
@chmod($dest, 0644);

out(['ok' => true, 'url' => $BASE_URL . $clean . '.' . $ext]);
