<?php
/**
 * ReviewImage Model
 * Maps to `review_images` table
 */

require_once __DIR__ . '/../Core/Model.php';

class ReviewImage extends Model {
    protected string $table = 'review_images';

    public function getImagesByReview(int $reviewId): array {
        $sql = "SELECT * FROM `review_images` WHERE `review_id` = :review_id ORDER BY `sort_order` ASC, `id` ASC";
        return $this->fetchAll($sql, [':review_id' => $reviewId]);
    }

    public function addImage(int $reviewId, string $imagePath, int $sortOrder = 0): int {
        return $this->insert([
            'review_id'   => $reviewId,
            'image_path'  => $imagePath,
            'sort_order'  => $sortOrder,
            'created_at'  => date('Y-m-d H:i:s')
        ]);
    }

    public function deleteImagesByReview(int $reviewId): bool {
        $images = $this->getImagesByReview($reviewId);
        foreach ($images as $img) {
            $this->removePhysicalFile($img['image_path']);
        }
        $sql = "DELETE FROM `review_images` WHERE `review_id` = :review_id";
        $this->query($sql, [':review_id' => $reviewId]);
        return true;
    }

    public function deleteImageById(int $imageId, int $reviewId): bool {
        $img = $this->fetchOne("SELECT * FROM `review_images` WHERE `id` = :id AND `review_id` = :review_id LIMIT 1", [
            ':id' => $imageId,
            ':review_id' => $reviewId
        ]);
        if ($img) {
            $this->removePhysicalFile($img['image_path']);
            $this->delete($imageId);
            return true;
        }
        return false;
    }

    private function removePhysicalFile(string $relativePath): void {
        $fullPath = __DIR__ . '/../../' . ltrim($relativePath, '/');
        if (file_exists($fullPath) && is_file($fullPath)) {
            @unlink($fullPath);
        }
    }
}
