<?php
use SLiMS\Pdf\Factory;
use SLiMS\Pdf\Contract;
use Dompdf\Dompdf;

require __DIR__ . '/../vendor/autoload.php';

class MyProvider extends Contract {

    public function setPdf():void
    {
        $this->pdf = new Dompdf();
    }

    public function setContent():void
    {
        $this->pdf->loadHtml('<h1>Hello World!</h1>');
    }
    
    public function download(string $filename):void
    {
        $this->stream($filename, ['Attachment' => true]);
    }
    
    public function stream(?string $filename = null, ?array $options = null):void
    {
        $this->pdf->render();
        $this->pdf->stream(($filename??md5('this') . 'pdf'), ($options??['Attachment' => false]));
        exit;
    }
    
    public function saveToFile(string $filepath, ?Closure $callback = null):void
    {
        $this->pdf->render();
        if ($callback !== null) {
            $callback($this->pdf, $filepath);
        } else {
            file_put_contents($filepath, $this->pdf->output());
            exit;
        }
    }
}

Factory::registerProvider('MyProvider', MyProvider::class);
Factory::use('MyProvider');

if (isset($_GET['download'])) {
    Factory::download('harno.pdf');
}

if (isset($_GET['stream'])) {
    Factory::stream();
}

if (isset($_GET['save'])) {
    // Simple save
    Factory::saveToFile(__DIR__ . '/test.pdf');

    // Advance save with custom file handler
    Factory::saveToFile('test2.pdf', function($pdf, $filepath) {
        // you can use league\filesystem etc.
        file_put_contents(__DIR__ . '/' . $filepath, $pdf->output());
    });
}