<?php

use Kirby\Cms\Page;

/**
 * @method object categories()
 * @method object tags()
 * @method object date()
 * @method object text()
 */
class ArticlePage extends Page
{
    private const READING_TIME_FORMAT = '%d words, ~%d min reading time';

    /**
     * @param array|string|null $options
     */
    public function url($options = null): string
    {
        $date = $this->date()->toDate('Y/m/d');
        return '/' . $date .'/' . $this->slug();
    }

    public function readingTime(): string
    {
        $doc = new DOMDocument();
        $doc->loadHTML(
            '<html><head><meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>'
            . $this->text()->kirbytext()
            . '</body></html>'
        );
        $pElems = $doc->getElementsByTagName('p');

        $text = '';
        foreach ($pElems as $pElem) {
            $text .= $pElem->nodeValue . ' ';
        }

        $wordCount = count(explode(' ', $text));
        $readingTime = (int)ceil($wordCount / 150);

        return sprintf(self::READING_TIME_FORMAT, $wordCount, $readingTime);
    }
}