<?php

declare(strict_types=1);

namespace vonRotenberg\CoretoolsBundle\Controller\ContentElement;

use Contao\ContentModel;
use Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
use Contao\CoreBundle\DependencyInjection\Attribute\AsContentElement;
use Contao\CoreBundle\Twig\FragmentTemplate;
use Contao\FilesModel;
use Contao\System;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

#[AsContentElement(category: 'miscellaneous', nestedFragments: true)]
class BackgroundWrapperController extends AbstractContentElementController
{
    protected function getResponse(FragmentTemplate $template, ContentModel $model, Request $request): Response
    {
        $GLOBALS['TL_CSS']['vr_coretools'] = 'bundles/vonrotenbergcoretools/css/background-wrapper.min.css|static';
        $arrData = array_merge($template->getData(),[
            'element_css_classes' => trim($template->element_css_classes . ' ' . $this->getWrapperClasses($model))
        ]);

        if ($model->vr_bw_addImage)
        {
            $objFile = FilesModel::findByUuid($model->vr_bw_bgSRC);

            if ($objFile !== null && is_file(System::getContainer()->getParameter('kernel.project_dir') . '/' . $objFile->path))
            {

                if (!in_array($objFile->extension,['mp4', 'm4v', 'mov', 'wmv', 'webm', 'ogv']))
                {
                    $figure = System::getContainer()
                        ->get('contao.image.studio')
                        ->createFigureBuilder()
                        ->from($objFile)
                        ->setSize($model->size)
                        ->buildIfResourceExists();

                    if ($figure !== null && $model->vr_bw_minHeight === '-mh-bgimage')
                    {
                        $imageData = $figure->getImage()->getPicture()->getImg();

                        $ratio = round(100 / $imageData['width'] * $imageData['height'],3);
                        $arrData['minHeight_ratio'] = $ratio;
                    }

                    $arrData['background_figure'] = $figure;
                } else {
                    $arrData['background_video'] = [
                        'path' => System::getContainer()->get('contao.assets.files_context')->getStaticUrl() . $objFile->path,
                        'extension' => $objFile->extension
                    ];
                }
            }
        }

        $template->setData($arrData);

        return $template->getResponse();
    }

    /**
     * @param ContentModel $model
     *
     * @return string
     */
    protected function getWrapperClasses(ContentModel $model): string
    {
        $arrCssClasses = [];

        // Add background image classes
        if ($model->vr_bw_addImage)
        {
            if (!empty($model->vr_bw_bgSize))
            {
                $arrCssClasses[] = $model->vr_bw_bgSize;
            }
            if (!empty($model->vr_bw_bgPos))
            {
                $arrCssClasses[] = $model->vr_bw_bgPos;
            }
            if (!empty($model->vr_bw_bgOpacity))
            {
                $arrCssClasses[] = $model->vr_bw_bgOpacity;
            }
        }
        if (!empty($model->vr_bw_bgColor))
        {
            $arrCssClasses[] = $model->vr_bw_bgColor;
        }
        if ($model->vr_bw_bgWidthRestriction)
        {
            $arrCssClasses[] = '-bg-width-restrict';
        }

        // Add content area classes
        if (!empty($model->vr_bw_width))
        {
            $arrCssClasses[] = $model->vr_bw_width;
        }
        if (!empty($model->vr_bw_minHeight))
        {
            $arrCssClasses[] = $model->vr_bw_minHeight;

            if ($model->vr_bw_minHeight == '-mh-vh' && !empty($model->vr_bw_mh_viewport))
            {
                $arrCssClasses[] = $model->vr_bw_mh_viewport;
            }
            if ($model->vr_bw_minHeight == '-mh-ratio' && !empty($model->vr_bw_mh_ratio))
            {
                $arrCssClasses[] = $model->vr_bw_mh_ratio;
            }
        }
        if (!empty($model->vr_bw_vAlign))
        {
            $arrCssClasses[] = $model->vr_bw_vAlign;
        }
        if ($model->vr_bw_colorInvert)
        {
            $arrCssClasses[] = '-color-inverted';
        }
        if (
            in_array($model->vr_bw_width,['-width-extended','-width-default-left','-width-default-right','-width-extended-left','-width-extended-right'])
            && $model->vr_bw_widthText)
        {
            $arrCssClasses[] = '-add-text-indent';
        }
        if (!empty($model->vr_bw_padding))
        {
            $arrCssClasses[] = $model->vr_bw_padding;
        }

        return implode(' ', $arrCssClasses);
    }
}