<?php

class CollectionShare
{
    private PDO $db;

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

    public function share(int $collectionId, int $sharedWithUserId, int $sharedByUserId): bool
    {
        $stmt = $this->db->prepare(
            'INSERT IGNORE INTO collection_shares (collection_id, shared_with_user_id, shared_by_user_id)
             VALUES (:collection_id, :shared_with_user_id, :shared_by_user_id)'
        );
        return $stmt->execute([
            'collection_id'       => $collectionId,
            'shared_with_user_id' => $sharedWithUserId,
            'shared_by_user_id'   => $sharedByUserId,
        ]);
    }

    public function unshare(int $id): bool
    {
        $stmt = $this->db->prepare('DELETE FROM collection_shares WHERE id = :id');
        return $stmt->execute(['id' => $id]);
    }

    public function getSharedWith(int $collectionId): array
    {
        $stmt = $this->db->prepare(
            'SELECT cs.*, u.username, u.display_name
             FROM collection_shares cs
             JOIN users u ON cs.shared_with_user_id = u.id
             WHERE cs.collection_id = :collection_id
             ORDER BY cs.created_at DESC'
        );
        $stmt->execute(['collection_id' => $collectionId]);
        return $stmt->fetchAll();
    }

    public function getSharedToUser(int $userId): array
    {
        $stmt = $this->db->prepare(
            'SELECT c.*, cs.id AS share_id, cs.shared_by_user_id, u.display_name AS shared_by_name
             FROM collection_shares cs
             JOIN collections c ON cs.collection_id = c.id
             JOIN users u ON cs.shared_by_user_id = u.id
             WHERE cs.shared_with_user_id = :user_id
             ORDER BY cs.created_at DESC'
        );
        $stmt->execute(['user_id' => $userId]);
        return $stmt->fetchAll();
    }

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

    public function isSharedWith(int $collectionId, int $userId): bool
    {
        $stmt = $this->db->prepare(
            'SELECT COUNT(*) FROM collection_shares WHERE collection_id = :cid AND shared_with_user_id = :uid'
        );
        $stmt->execute(['cid' => $collectionId, 'uid' => $userId]);
        return (int)$stmt->fetchColumn() > 0;
    }
}
