<?php
class Post {
    private $conn;

    public function __construct($db) {
        $this->conn = $db;
    }

    public function getAll() {
        $query = "SELECT p.*,
                          COALESCE(u.name, 'مستخدم') as user_name,
                          COALESCE(u.profile_picture, '') as profile_picture,
         COALESCE(u.is_verified, 0) as is_verified,
                          COALESCE(u.total_followers, 0) as total_followers,
                          COALESCE(u.total_likes, 0) as total_likes,
                          COALESCE(l.likes_count, 0) as likes_count,
                          COALESCE(c.comments_count, 0) as comments_count
                   FROM posts p
                   LEFT JOIN users u ON p.user_id = u.id
                   LEFT JOIN (
                       SELECT post_id, COUNT(*) as likes_count
                       FROM post_likes
                       GROUP BY post_id
                   ) l ON p.id = l.post_id
                   LEFT JOIN (
                       SELECT post_id, COUNT(*) as comments_count
                       FROM post_comments
                       GROUP BY post_id
                   ) c ON p.id = c.post_id
                   ORDER BY p.created_at DESC";

        $stmt = $this->conn->prepare($query);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function getOne($id) {
        $query = "SELECT p.*, COALESCE(l.likes_count, 0) as likes_count, COALESCE(c.comments_count, 0) as comments_count
                 FROM posts p
                 LEFT JOIN (
                     SELECT post_id, COUNT(*) as likes_count
                     FROM post_likes
                     GROUP BY post_id
                 ) l ON p.id = l.post_id
                 LEFT JOIN (
                     SELECT post_id, COUNT(*) as comments_count
                     FROM post_comments
                     GROUP BY post_id
                 ) c ON p.id = c.post_id
                 WHERE p.id = ?";

        $stmt = $this->conn->prepare($query);
        $stmt->execute([$id]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    public function getComments($postId) {
        $query = "SELECT pc.*, u.name as user_name
                 FROM post_comments pc
                 LEFT JOIN users u ON pc.user_id = u.id
                 WHERE pc.post_id = ?
                 ORDER BY pc.created_at DESC";

        $stmt = $this->conn->prepare($query);
        $stmt->execute([$postId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function likePost($postId, $userId) {
        // Check if user already liked this post
        $checkQuery = "SELECT id FROM post_likes WHERE post_id = ? AND user_id = ?";
        $checkStmt = $this->conn->prepare($checkQuery);
        $checkStmt->execute([$postId, $userId]);

        if ($checkStmt->fetch()) {
            // Unlike
            $deleteQuery = "DELETE FROM post_likes WHERE post_id = ? AND user_id = ?";
            $deleteStmt = $this->conn->prepare($deleteQuery);
            return $deleteStmt->execute([$postId, $userId]);
        } else {
            // Like
            $insertQuery = "INSERT INTO post_likes (post_id, user_id, created_at) VALUES (?, ?, NOW())";
            $insertStmt = $this->conn->prepare($insertQuery);
            return $insertStmt->execute([$postId, $userId]);
        }
    }

    public function addComment($postId, $userId, $comment) {
        $query = "INSERT INTO post_comments (post_id, user_id, comment, created_at) VALUES (?, ?, ?, NOW())";
        $stmt = $this->conn->prepare($query);
        return $stmt->execute([$postId, $userId, $comment]);
    }

    public function checkUserLike($postId, $userId) {
        $query = "SELECT id FROM post_likes WHERE post_id = ? AND user_id = ?";
        $stmt = $this->conn->prepare($query);
        $stmt->execute([$postId, $userId]);
        return $stmt->fetch(PDO::FETCH_ASSOC) ? true : false;
    }

    public function create($caption, $image) {
        $query = "INSERT INTO posts (caption, image, created_at) VALUES (?, ?, NOW())";
        $stmt = $this->conn->prepare($query);
        return $stmt->execute([$caption, $image]);
    }

    public function update($id, $caption, $image = null) {
        if ($image !== null) {
            $query = "UPDATE posts SET caption = ?, image = ? WHERE id = ?";
            $stmt = $this->conn->prepare($query);
            return $stmt->execute([$caption, $image, $id]);
        } else {
            $query = "UPDATE posts SET caption = ? WHERE id = ?";
            $stmt = $this->conn->prepare($query);
            return $stmt->execute([$caption, $id]);
        }
    }

    public function delete($id) {
        $query = "DELETE FROM posts WHERE id = ?";
        $stmt = $this->conn->prepare($query);
        return $stmt->execute([$id]);
    }
}
?>