<?php
namespace App\Libraries;

//use FPDI in myMerge v2
//use FPDF;
//use FPDI;

class MyPDFMerger
{
    private $_files;    //['form.pdf']  ["1,2,4, 5-19"]
    private $_fpdi;

    
    public function __construct()
    {
       /* if(!class_exists("FPDF")) {
            require_once(__DIR__.'/fpdf/fpdf.php');
        }
        if(!class_exists("FPDI")) {
            require_once(__DIR__.'/fpdi/fpdi.php');
        }*/
    }

    public function addPDF($filepath, $pages = 'all')
    {
        if (file_exists($filepath)) {
            if (strtolower($pages) != 'all') {
                $pages = $this->_rewritepages($pages);
            }

            $this->_files[] = array($filepath, $pages);
        } else {
            throw new \exception("Could not locate PDF on '$filepath'");
        }

        return $this;
    }


    public function myMerge($outputmode = 'browser', $outputpath = 'newfile.pdf', $theme = false)
    {
        if (!isset($this->_files) || !is_array($this->_files)): throw new \exception("No PDFs to merge."); endif;

        $fpdi = new \setasign\Fpdi\Fpdi();
        $first = 1;

        //
        //merger operations
        foreach ($this->_files as $file) {
            $filename = $file[0];
            $filepages = $file[1];


            $count = $fpdi->setSourceFile($filename);

            //add the pages
            if ($filepages == 'all') {
                for ($i = 1; $i <= $count; $i++) {
                    $count = $fpdi->setSourceFile($filename);
                    $template = $fpdi->importPage($i);
                    $size = $fpdi->getTemplateSize($template);
                    $orientation = ($size['height'] > $size['width']) ? 'P' : 'L';

                    $fpdi->AddPage($orientation, array($size['width'], $size['height']));
                    if($theme){
                        $fpdi->setSourceFile(__DIR__ . '/../../public/pdf/'.$theme.'-'.$first.'.pdf');
                        if($first == 1){
                            $first = 2;
                        }
                        $backId = $fpdi->importPage(1);
                        $fpdi->useTemplate($backId);

                    }
                    $fpdi->useTemplate($template);
                }
            } else {
                foreach ($filepages as $page) {
                    $count = $fpdi->setSourceFile($filename);
                    if (!$template = $fpdi->importPage($page)): throw new \exception("Could not load page '$page' in PDF '$filename'. Check that the page exists."); endif;
                    $size = $fpdi->getTemplateSize($template);
                    $orientation = ($size['h'] > $size['w']) ? 'P' : 'L';

                    $fpdi->AddPage($orientation, array($size['w'], $size['h']));
                    if($theme){
                        $fpdi->setSourceFile(__DIR__ . '/../../public/pdf/'.$theme.'-'.$first.'.pdf');
                        if($first == 1){
                            $first = 2;
                        }
                        $backId = $fpdi->importPage(1);
                        $fpdi->useTemplate($backId);
                    }

                    $fpdi->useTemplate($template);
                }
            }
            //after first file (invoice) on bpaper
            $slug = false;
        }

        //output operations
        $mode = $this->_switchmode($outputmode);

        if ($mode == 'S') {
            return $fpdi->Output($outputpath, 'S');
        } else {
            if ($fpdi->Output($outputpath, $mode) == '') {
                return true;
            } else {
                throw new \exception("Error outputting PDF to '$outputmode'.");
                return false;
            }
        }


    }

        /**
     * FPDI uses single characters for specifying the output location. Change our more descriptive string into proper format.
     * @param $mode
     * @return Character
     */
    private function _switchmode($mode)
    {
        switch (strtolower($mode)) {
            case 'download':
                return 'D';
                break;
            case 'browser':
                return 'I';
                break;
            case 'file':
                return 'F';
                break;
            case 'string':
                return 'S';
                break;
            default:
                return 'I';
                break;
        }
    }

      /**
     * Takes our provided pages in the form of 1,3,4,16-50 and creates an array of all pages
     * @param $pages
     * @return array
     * @throws exception
     */
    private function _rewritepages($pages)
    {
        $pages = str_replace(' ', '', $pages);
        $part = explode(',', $pages);

        //parse hyphens
        foreach ($part as $i) {
            $ind = explode('-', $i);

            if (count($ind) == 2) {
                $x = $ind[0]; //start page
                $y = $ind[1]; //end page

                if ($x > $y): throw new \exception("Starting page, '$x' is greater than ending page '$y'.");
                    return false; endif;

                //add middle pages
                while ($x <= $y): $newpages[] = (int)$x;
                    $x++; endwhile;
            } else {
                $newpages[] = (int)$ind[0];
            }
        }

        return $newpages;
    }
}


/*
$pdf = new PDFMerger;

$pdf->addPDF('samplepdfs/one.pdf', '1, 3, 4')
	->addPDF('samplepdfs/two.pdf', '1-2')
	->addPDF('samplepdfs/three.pdf', 'all')
	->merge('file', 'samplepdfs/TEST2.pdf');

	//REPLACE 'file' WITH 'browser', 'download', 'string', or 'file' for output options
	//You do not need to give a file path for browser, string, or download - just the name.
*/