<?php

/**
 * ตรวจและบันทึกไฟล์รูปอย่างปลอดภัย
 *
 * @return array{ok: bool, filename?: string, error?: string}
 */
function saveUploadedImage($file, $targetDir, $maxBytes = 2097152)
{
    if (!isset($file['error']) || $file['error'] === UPLOAD_ERR_NO_FILE) {
        return ['ok' => true, 'filename' => ''];
    }

    if ($file['error'] !== UPLOAD_ERR_OK) {
        return ['ok' => false, 'error' => 'เกิดข้อผิดพลาดในการอัปโหลดรูปภาพ'];
    }

    if (($file['size'] ?? 0) <= 0 || $file['size'] > $maxBytes) {
        return ['ok' => false, 'error' => 'รูปภาพต้องมีขนาดไม่เกิน 2 MB'];
    }

    $allowedMimeTypes = [
        'image/jpeg' => 'jpg',
        'image/png' => 'png',
    ];

    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mimeType = $finfo->file($file['tmp_name']);

    if (
        !isset($allowedMimeTypes[$mimeType]) ||
        getimagesize($file['tmp_name']) === false
    ) {
        return ['ok' => false, 'error' => 'รองรับเฉพาะไฟล์ JPG, JPEG และ PNG'];
    }

    if (!is_dir($targetDir) && !mkdir($targetDir, 0755, true)) {
        return ['ok' => false, 'error' => 'ไม่สามารถสร้างโฟลเดอร์เก็บรูปภาพได้'];
    }

    $filename = bin2hex(random_bytes(16)) . '.' . $allowedMimeTypes[$mimeType];
    $destination = rtrim($targetDir, '/\\') . DIRECTORY_SEPARATOR . $filename;

    if (!move_uploaded_file($file['tmp_name'], $destination)) {
        return ['ok' => false, 'error' => 'ไม่สามารถบันทึกรูปภาพได้'];
    }

    return ['ok' => true, 'filename' => $filename];
}

function deleteUploadedImage($targetDir, $filename)
{
    if ($filename === null || $filename === '') {
        return;
    }

    $safeFilename = basename($filename);
    $path = rtrim($targetDir, '/\\') . DIRECTORY_SEPARATOR . $safeFilename;

    if (is_file($path)) {
        unlink($path);
    }
}
