<?php

namespace App\Service\Content;

use App\Entity\Content;
use App\Entity\ContentVersion;
use App\Entity\File;
use App\Service\FileService;
use AppKernel;
use GGGGino\WordBundle\Factory;
use League\Flysystem\Filesystem;
use PhpOffice\PhpWord\Element\Link;
use PhpOffice\PhpWord\Element\Section;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\Settings;
use PhpOffice\PhpWord\Shared\Html;
use Symfony\Component\HttpKernel\KernelInterface;

class ContentFileExporter
{
    /**
     * @var Factory
     */
    private $factory;
    /**
     * @var Filesystem
     */
    private $filesystem;
    /**
     * @var FileService
     */
    private $fileService;
    /**
     * @var AppKernel
     */
    private $kernel;

    public function __construct(Factory $factory, Filesystem $filesystem, FileService $fileService, KernelInterface $kernel)
    {
        $this->factory = $factory;
        $this->filesystem = $filesystem;
        $this->fileService = $fileService;
        $this->kernel = $kernel;
    }

    public function export(Content $content, string $extension): File
    {
        /** @var ContentVersion $version */
        $version = $content->getVersions()->first();

        Settings::setOutputEscapingEnabled(true);

        $word = new PhpWord();

        $word->addLinkStyle('Link', ['color' => '0000FF', 'underline' => 'single']);

        $section = $word->addSection();

        $html = $version->getDescription();
        str_replace('<h1>', '<h1 style="font-size: 22px; font-weight: bold">', $html);
        str_replace('<h2>', '<h2 style="font-size: 20px; font-weight: bold">', $html);
        str_replace('<h3>', '<h3 style="font-size: 18px; font-weight: bold">', $html);
        str_replace('<h4>', '<h4 style="font-size: 16px; font-weight: bold">', $html);
        $html = str_replace('<br>', '<br/>', $html);

        Html::addHtml($section, $html);

        /** @var Section $section */
        foreach($word->getSections() as $section)
        {
            foreach($section->getElements() as $element)
            {
                foreach ($element->getElements() as $nestedElement) {
                    if ($nestedElement instanceof Link) {
                        /** @var Link $element */
                        $fontStyle = $nestedElement->getFontStyle();
                        $fontStyle->setColor('#0000ff')
                            ->setUnderline('single');

                    }
                }
            }
        }
        $domPdfPath = realpath(__DIR__.'/../../../vendor/dompdf/dompdf');
        \PhpOffice\PhpWord\Settings::setPdfRendererPath($domPdfPath);
        \PhpOffice\PhpWord\Settings::setPdfRendererName('DomPDF');

        $filename = str_replace(' ', '_', trim(mb_convert_case(substr($content->getTitle(), 0, 40), 1))) . '-' . substr(sha1($version->getId() . $version->getCreatedAt()->format('Y-m-d h:i:s')), 0, 10);
        $filename = preg_replace('/[^a-z0-9]+/', '-', strtolower($filename));

        $year = date('Y', time());
        $month = date('m', time());

        if ('PDF' !== $extension) {
            $writer = $this->factory->createWriter($word);
        } else {
            $writer = $this->factory->createWriter($word, $extension);
        }

        $dirPath = sprintf('%s/%s', $year, $month);

        if (!$this->filesystem->has($dirPath)) {
            $this->filesystem->createDir($dirPath);
        }

        $filenamePath = sprintf('%s/public/uploads/%s/%s.%s', $this->kernel->getProjectDir(), $dirPath, $filename,
            strtolower($extension));

        $writer->save($filenamePath);

        $info = new \SplFileInfo($filenamePath);

        $file = (new File())
            ->setFilename(sprintf('%s.%s', $filename, strtolower($extension)))
            ->setPath($year . '/' . $month . '/')
            ->setTitle(sprintf('%s - version #%d', $content->getTitle(), $content->getVersions()->count()))
            ->setMimetype(mime_content_type($filenamePath))
            ->setSize($info->getSize());

        return $this->fileService->save($file);
    }
}
