<?php

namespace App\Models;

use App\Utils\Database;

/**
 * ImageCleanup - 图片清理模型
 * 用于清理冗余图片和维护数据库与文件系统的一致性
 */
class ImageCleanup
{
    private $db;

    public function __construct()
    {
        $this->db = Database::getInstance()->getConnection();
    }

    /**
     * 清理冗余图片
     * 删除数据库中存在但文件系统中不存在的图片记录
     * 以及文件系统中存在但数据库中没有记录的图片文件
     */
    public function cleanupRedundantImages()
    {
        $uploadDir = $_ENV['UPLOAD_DIR'] ?? '../uploads';
        $deletedCount = 0;

        // 1. 获取数据库中所有图片记录
        $stmt = $this->db->prepare("SELECT id, stored_name FROM image");
        $stmt->execute();
        $dbImages = $stmt->fetchAll(\PDO::FETCH_ASSOC);

        $dbImageFiles = [];
        foreach ($dbImages as $image) {
            $dbImageFiles[$image['stored_name']] = $image['id'];
        }

        // 2. 获取文件系统中所有图片文件
        if (!is_dir($uploadDir)) {
            return 0;
        }

        $files = scandir($uploadDir);
        $fsImages = array_filter($files, function($file) use ($uploadDir) {
            return is_file($uploadDir . '/' . $file) && $file !== '.' && $file !== '..';
        });

        // 3. 删除数据库中存在但文件系统中不存在的记录
        foreach ($dbImageFiles as $fileName => $imageId) {
            $filePath = $uploadDir . '/' . $fileName;
            if (!file_exists($filePath)) {
                $stmt = $this->db->prepare("DELETE FROM image WHERE id = ?");
                $stmt->execute([$imageId]);
                $deletedCount++;
            }
        }

        // 4. 删除文件系统中存在但数据库中没有记录的文件
        foreach ($fsImages as $file) {
            if (!isset($dbImageFiles[$file])) {
                $filePath = $uploadDir . '/' . $file;
                if (file_exists($filePath)) {
                    unlink($filePath);
                    $deletedCount++;
                }
            }
        }

        return $deletedCount;
    }
}
