<?php
declare(strict_types=1);

require __DIR__ . '/partials/auth.php';
if (function_exists('require_teacher_login')) {
    require_teacher_login();
}
if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

header('Content-Type: application/json; charset=utf-8');

// Saving changes affects the shared avatar manifest: Admin only.
$avatarBuilderRole = strtolower(trim((string)($_SESSION['user_role'] ?? '')));
if ($avatarBuilderRole !== 'admin') {
    http_response_code(403);
    echo json_encode([
        'ok' => false,
        'message' => 'Bạn không có quyền thay đổi tài nguyên avatar hệ thống.'
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}

function avatarBuilderReply(bool $ok, string $message, int $status=200): never
{
    http_response_code($status);
    echo json_encode(['ok'=>$ok,'message'=>$message], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    avatarBuilderReply(false,'Method not allowed.',405);
}

$token=(string)($_POST['csrf_token']??'');
if (empty($_SESSION['avatar_builder_csrf']) || !hash_equals((string)$_SESSION['avatar_builder_csrf'],$token)) {
    avatarBuilderReply(false,'Phiên làm việc đã thay đổi.',403);
}

$hairId=trim((string)($_POST['hair_id']??''));
$scale=filter_var($_POST['scale']??null,FILTER_VALIDATE_FLOAT);
$offsetX=filter_var($_POST['offset_x']??null,FILTER_VALIDATE_INT);
$offsetY=filter_var($_POST['offset_y']??null,FILTER_VALIDATE_INT);

if ($hairId==='' || $scale===false || $offsetX===false || $offsetY===false) {
    avatarBuilderReply(false,'Dữ liệu không hợp lệ.',422);
}
if ($scale<0.45 || $scale>1.25 || $offsetX<-120 || $offsetX>120 || $offsetY<-120 || $offsetY>120) {
    avatarBuilderReply(false,'Giá trị vượt giới hạn.',422);
}

$file=__DIR__.'/../assets/avatars/builder/manifest.json';
if (!is_file($file) || !is_readable($file)) {
    avatarBuilderReply(false,'Không đọc được manifest.json.',500);
}

$data=json_decode((string)file_get_contents($file),true);
if (!is_array($data)) {
    avatarBuilderReply(false,'manifest.json không hợp lệ.',500);
}

$found=false;
if (isset($data['categories']['hair']['items']) && is_array($data['categories']['hair']['items'])) {
    foreach ($data['categories']['hair']['items'] as &$item) {
        if (($item['id']??'') === $hairId) {
            $item['fit']=['scale'=>round((float)$scale,2),'offset_x'=>(int)$offsetX,'offset_y'=>(int)$offsetY];
            $found=true;
            break;
        }
    }
    unset($item);
}
if (!$found) {
    avatarBuilderReply(false,'Không tìm thấy kiểu tóc.',404);
}

$json=json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);
if ($json===false) {
    avatarBuilderReply(false,'Không tạo được JSON.',500);
}

$tmp=$file.'.tmp';
if (file_put_contents($tmp,$json,LOCK_EX)===false) {
    avatarBuilderReply(false,'Không có quyền ghi thư mục builder.',500);
}
if (!@rename($tmp,$file)) {
    @unlink($tmp);
    avatarBuilderReply(false,'Không thay được manifest.json.',500);
}

avatarBuilderReply(true,'Đã lưu.');
