<?php

class ListingImage
{
    private PDO $db;

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

    public function getByListing(int $listingId): array
    {
        $stmt = $this->db->prepare(
            'SELECT * FROM listing_images WHERE listing_id = :listing_id ORDER BY sort_order ASC, id ASC'
        );
        $stmt->execute(['listing_id' => $listingId]);
        return $stmt->fetchAll();
    }

    public function create(int $listingId, string $filename, int $sortOrder = 0): int
    {
        $stmt = $this->db->prepare(
            'INSERT INTO listing_images (listing_id, filename, sort_order) VALUES (:listing_id, :filename, :sort_order)'
        );
        $stmt->execute([
            'listing_id' => $listingId,
            'filename'   => $filename,
            'sort_order' => $sortOrder,
        ]);
        return (int)$this->db->lastInsertId();
    }

    public function delete(int $id): bool
    {
        $image = $this->findById($id);
        if ($image) {
            FileUpload::delete(UPLOAD_LISTINGS_PATH . '/' . $image['filename']);
            $thumbPath = FileUpload::getThumbnailPath(UPLOAD_LISTINGS_PATH . '/' . $image['filename'], UPLOAD_LISTINGS_THUMBS_PATH);
            FileUpload::delete($thumbPath);
        }
        $stmt = $this->db->prepare('DELETE FROM listing_images WHERE id = :id');
        return $stmt->execute(['id' => $id]);
    }

    public function findById(int $id): ?array
    {
        $stmt = $this->db->prepare('SELECT * FROM listing_images WHERE id = :id LIMIT 1');
        $stmt->execute(['id' => $id]);
        $row = $stmt->fetch();
        return $row ?: null;
    }

    public function deleteByListing(int $listingId): void
    {
        $images = $this->getByListing($listingId);
        foreach ($images as $image) {
            FileUpload::delete(UPLOAD_LISTINGS_PATH . '/' . $image['filename']);
            $thumbPath = FileUpload::getThumbnailPath(UPLOAD_LISTINGS_PATH . '/' . $image['filename'], UPLOAD_LISTINGS_THUMBS_PATH);
            FileUpload::delete($thumbPath);
        }
        $stmt = $this->db->prepare('DELETE FROM listing_images WHERE listing_id = :listing_id');
        $stmt->execute(['listing_id' => $listingId]);
    }

    public function countByListing(int $listingId): int
    {
        $stmt = $this->db->prepare('SELECT COUNT(*) FROM listing_images WHERE listing_id = :listing_id');
        $stmt->execute(['listing_id' => $listingId]);
        return (int)$stmt->fetchColumn();
    }

    public function getFirstByListing(int $listingId): ?array
    {
        $stmt = $this->db->prepare(
            'SELECT * FROM listing_images WHERE listing_id = :listing_id ORDER BY sort_order ASC, id ASC LIMIT 1'
        );
        $stmt->execute(['listing_id' => $listingId]);
        $row = $stmt->fetch();
        return $row ?: null;
    }
}
