<?php

/*
    Definice
    Návrhový vzor Factory Method definuje rozhraní pro vytváření objektů, 
    přičemž vlastní tvorbu instancí přenechává svým potomkům. Potomci rozhodují, které konkrétní implementace se mají použít.
*/


abstract class AbstractPublisher
{
    protected $category;

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

    public function sellPublication($pageCount)
    {
        $publication = $this->createPublication($pageCount);
        $publication->open();
        $page = mt_rand(1, $pageCount);
        $publication->setPageNumber($page);
        $publication->close();

        return $publication;
    }

    abstract protected function createPublication($pageCount);
}


class BookPublisher extends AbstractPublisher
{
    protected function createPublication($pageCount)
    {
        $publication = new Book($this->category, $pageCount);
        return $publication;
    }
}


class JournalPublisher extends AbstractPublisher
{
    protected function createPublication($pageCount)
    {
        // Journal je jako Book
        $publication = new Journal($this->category, $pageCount);
        return $publication;
    }
}


// Usage
$bookPublisher = new BookPublisher('PC');
$book = $bookPublisher->sellPublication(100);
print "Zakoupena nová publikace: \n";
printf("Typ: %s \n", get_class($book));
printf("Kategorie: %s \n", $book->getCategory());
printf("Počet stran: %d \n", $book->getPageCount());

$journalPublisher = new JournalPublisher('medicína');
$journal = $journalPublisher->sellPublication(20);
print "Zakoupena nová publikace: \n";
printf("Typ: %s \n", get_class($journal));
printf("Kategorie: %s \n", $journal->getCategory());
printf("Počet stran: %d \n", $journal->getPageCount());