<?php declare(strict_types=1);
namespace openvk\Web\Models\Repositories;
use openvk\Web\Models\Entities\{BugReport};
use Nette\Database\Table\ActiveRow;
use Chandler\Database\DatabaseConnection;

class BugtrackerReports
{
    private $context;
    private $reports;
    private $reportsPerPage = 5;
    
    function __construct()
    {
        $this->context = DatabaseConnection::i()->getContext();
        $this->reports   = $this->context->table("bugs");
    }

    private function toReport(?ActiveRow $ar)
    {
        return is_null($ar) ? NULL : new BugReport($ar);
    }

    function get(int $id): ?BugReport
    {
        return $this->toReport($this->reports->get($id));
    }

    function getAllReports(int $page = 1): \Traversable
    {
        foreach($this->reports->where(["deleted" => NULL])->order("created DESC")->page($page, 5) as $report)
            yield new BugReport($report);
    }

    function getReports(int $product_id = 0, int $page = 1): \Traversable
    {
        foreach($this->reports->where(["deleted" => NULL, "product_id" => $product_id])->order("created DESC")->page($page, 5) as $report)
            yield new BugReport($report);
    }

    function getReportsCount(int $product_id): int
    {
        return $product_id
            ? sizeof($this->reports->where(["deleted" => NULL, "product_id" => $product_id]))
            : sizeof($this->reports->where(["deleted" => NULL]));
    }

    function getByReporter(int $reporter_id, int $page = 1): \Traversable
    {
        foreach($this->reports->where(["deleted" => NULL, "reporter" => $reporter_id])->order("created DESC")->page($page, 5) as $report)
            yield new BugReport($report);
    }

    function getCountByReporter(int $reporter_id): ?int
    {
        return sizeof($this->reports->where(["deleted" => NULL, "reporter" => $reporter_id]));
    }

    function getSuccCountByReporter(int $reporter_id): ?int
    {
        return sizeof($this->reports->where(["deleted" => NULL, "reporter" => $reporter_id, "status" => "<= 4"]));
    }
}