<?php

class GalleryItem {

    private const table_name = "gallery";
	private const select = "
		SELECT
			g.*,
			(select count(id) from gallery_like where gallery_id = g.id) as likes,

			lu.id as lu_id,
			lu.name as lu_name,
			lu.surname as lu_surname,
			lu.code as lu_code,
			lu.picture as lu_picture,
			lu.admin as lu_admin,
			lu.table as lu_table,
			lu.witness as lu_witness,
			lu.invited_by as lu_invited_by,

			au.id as au_id,
			au.name as au_name,
			au.surname as au_surname,
			au.code as au_code,
			au.picture as au_picture,
			au.admin as au_admin,
			au.table as au_table,
			au.witness as au_witness,
			au.invited_by as au_invited_by,

			glcu.id as glcu_id,
			glcu.gallery_id as glcu_gallery_id,
			glcu.user_id as glcu_user_id,
			glcu.created as glcu_created

		FROM " . self::table_name . " g
			-- Author
			LEFT JOIN `user` au
				ON au.id = g.author
			-- First liked user
			LEFT JOIN gallery_like gl
				ON gl.gallery_id = g.id
			LEFT JOIN `user` lu
				ON lu.id = gl.user_id
			-- Like from current user
			LEFT JOIN gallery_like glcu
				ON glcu.gallery_id = g.id
				AND glcu.user_id = :uid
	";

    static function read($db, $uid, $page, $elemPerPage){
        $start = $page * $elemPerPage;
        $limit = $elemPerPage + 1;  // Retrieve one more item to know if there are elements and compute "more" value
        $query = self::select . "
            GROUP BY g.id
            ORDER BY created DESC
            LIMIT :start,:limit";

        // prepare query statement
        $stmt = $db->prepare($query);
		$stmt->bindParam(":uid", $uid);
		$stmt->bindParam(":start", $start, PDO::PARAM_INT);
		$stmt->bindParam(":limit", $limit, PDO::PARAM_INT);

        // execute query
        $stmt->execute();

        return $stmt;
    }

    static function readById($db, $uid, $id){
        $query = self::select . "
			WHERE g.id = :id
            GROUP BY g.id
            ORDER BY created DESC
		";
        // prepare query statement
        $stmt = $db->prepare($query);
		$stmt->bindParam(":id", $id);
		$stmt->bindParam(":uid", $uid);

        // execute query
        $stmt->execute();

        return $stmt;
    }

    static function create($db, $item){
        $query = "INSERT INTO " . self::table_name . "
            SET image_url=:imageUrl, image_thumb_url=:imageThumbUrl, description=:description, author=:author";

        // prepare query
        $stmt = $db->prepare($query);

        // sanitize
        $imageUrl=htmlspecialchars(strip_tags($item['imageUrl']));
        $imageThumbUrl=htmlspecialchars(strip_tags($item['imageThumbUrl']));
        $description=htmlspecialchars(strip_tags($item['description']));
        $author=htmlspecialchars(strip_tags($item['author']));

        // bind values
        $stmt->bindParam(":imageUrl", $imageUrl);
        $stmt->bindParam(":imageThumbUrl", $imageThumbUrl);
        $stmt->bindParam(":description", $description);
        $stmt->bindParam(":author", $author);

        // execute query
        if($stmt->execute()){
            return true;
        }
        return false;
    }

	static function fromRow($row) {
		return array(
			"id" => $row['id'],
			"imageUrl" => $row['image_url'],
			"imageThumbUrl" => $row['image_thumb_url'],
			"likes" => $row['likes'],
			"firstUserLiked" =>  User::createFromRow($row, 'lu'),
			"description" => $row['description'],
			"author" => User::createFromRow($row, 'au'),
			"created" => $row['created'],
			"currentUserLike" => Like::createFromRow($row, 'glcu'),
		);
	}
}
?>
