<?php

declare(strict_types=1);

/*
 * This file is part of contao-weinanlieferung-bundle.
 *
 * (c) vonRotenberg
 *
 * @license commercial
 */

namespace vonRotenberg\WeinanlieferungBundle\EventListener\DataContainer;

use Contao\CoreBundle\ServiceAnnotation\Callback;
use Contao\DataContainer;
use Contao\Date;
use Contao\Input;
use Contao\StringUtil;
use Doctrine\DBAL\Connection;
use Symfony\Contracts\Translation\TranslatorInterface;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungAttributeModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungUnitsModel;

class WeinanlieferungReservationContainerListener
{
    /** @var Connection */
    protected $db;

    private $translator;


    public function __construct(Connection $db,TranslatorInterface $translator)
    {
        $this->db = $db;
        $this->translator = $translator;
    }


    /**
     * @Callback(table="tl_vr_wa_reservation", target="fields.sorten.options")
     */
    public function onSortenOptionsCallback(DataContainer $dc)
    {
        $arrSorten = [];

        if (($Slot = WeinanlieferungSlotsModel::findByPk($dc->activeRecord->pid)) === null)
        {
            return $arrSorten;
        }

        $Sorten = StringUtil::deserialize($Slot->sorten,true);
        foreach($Sorten as $sorte)
        {
            $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']);
            $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
            $arrSorten[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
        }

        return $arrSorten;
    }

    /**
     * @Callback(table="tl_vr_wa_reservation", target="fields.lage.options")
     */
    public function onLageOptionsCallback(DataContainer $dc)
    {
        $arrLagen = [];

        if (($Slot = WeinanlieferungSlotsModel::findByPk($dc->activeRecord->pid)) === null || $Slot->lage === null)
        {
            return $arrLagen;
        }

        if (($Lagen = $Slot->getRelated('lage')) !== null)
        {
            $arrLagen = array_combine($Lagen->fetchEach('id'),$Lagen->fetchEach('title'));
        }

        return $arrLagen;
    }

    /**
     * @Callback(table="tl_vr_wa_reservation", target="fields.ernteart.options")
     */
    public function onErnteartOptionsCallback(DataContainer $dc)
    {
        $arrErnteart = [];

        if (($Slot = WeinanlieferungSlotsModel::findByPk($dc->activeRecord->pid)) === null || $Slot->ernteart === null)
        {
            return $arrErnteart;
        }

        $Ernteart = explode(',',$Slot->ernteart);
        foreach($Ernteart as $art)
        {
            $arrErnteart[$art] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$art] ?? $art;
        }

        return $arrErnteart;
    }

    /**
     * @Callback(table="tl_vr_wa_reservation", target="fields.pid.options")
     */
    public function onPidOptionsCallback(DataContainer $dc)
    {
        if (($Slots = WeinanlieferungSlotsModel::findAllFuturePublished()) === null)
        {
            return [];
        }

        $arrData = [];
        foreach ($Slots as $slot)
        {
            $arrSorten = [];
            $intAvailableBehaelter = $slot->getAvailableBehaelter();

            $Standort = $slot->getRelated('pid');

            $Sorten = StringUtil::deserialize($slot->sorten,true);
            foreach($Sorten as $sorte)
            {
                $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']);
                $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
                $arrSorten[] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
            }
            $arrData[$slot->id] = Date::parse(Date::getNumericDatimFormat(),$slot->time) . ' - ' . ($Standort !== null  ? $Standort->title : $slot->pid) . ' - (' . implode(', ',$arrSorten) . ') [Verfügbare Bottiche: ' . $intAvailableBehaelter . '/' . $slot->behaelter . ']';
        }

        return $arrData;
    }

    /**
     * @Callback(table="tl_vr_wa_reservation", target="fields.uid.options")
     */
    public function onUidOptionsCallback(DataContainer $dc)
    {
        if (($Members = \MemberModel::findAll()) === null)
        {
            return [];
        }

        $arrData = [];
        foreach ($Members as $member)
        {
            $arrData[$member->id] = ($member->memberno !== null && $member->memberno ? $member->memberno.' ' : '') . $member->firstname . ' ' . $member->lastname . ' [' . $member->email . ']';
        }

        return $arrData;
    }

    /**
     * @Callback(table="tl_vr_wa_reservation", target="fields.unit.options")
     */
    public function onUnitsOptionsCallback(DataContainer $dc)
    {
        $arrOptions = [];

        if (
            ($Slot = WeinanlieferungSlotsModel::findByPk($dc->activeRecord->pid)) !== null
            && ($Site = $Slot->getRelated('pid')) !== null
        )
        {
            if (($Units = $Site->getRelated('units')) !== null)
            {
                foreach ($Units as $unit)
                {
                    $arrOptions[$unit->id] = $unit->title . ' (' . $unit->containers . ' '.$this->translator->trans('tl_vr_wa_units.containers.0', [], 'contao_tl_vr_wa_units').')';
                }
            }

        }


        return $arrOptions;
    }

    /**
     * @Callback(table="tl_vr_wa_reservation", target="fields.amount.save")
     */
    public function adjustContainers($varValue, DataContainer $dc)
    {
        $intUnit = (Input::post('unit') !== null) ? intval(Input::post('unit')) : intval($dc->activeRecord->unit);

        $intContainers = $varValue;

        if ($intUnit)
        {
            if (($Unit = WeinanlieferungUnitsModel::findByPk($intUnit)) !== null)
            {
                $intContainers = intval($varValue) * intval($Unit->containers);
            }
        }

        $this->db->update($dc->table,['behaelter'=>$intContainers],['id'=>$dc->activeRecord->id]);

        return $varValue;
    }

    /**
     * Format attribute values for display in the backend
     *
     * @Callback(table="tl_vr_wa_reservation", target="fields.attribute_values.load")
     */
    public function formatAttributeValues($varValue, DataContainer $dc)
    {
        if (empty($varValue)) {
            return '';
        }

        try {
            $attributeValues = json_decode($varValue, true);

            if (!is_array($attributeValues) || empty($attributeValues)) {
                return '';
            }

            $formattedValues = [];

            foreach ($attributeValues as $attributeId => $value) {
                // Get attribute information
                $attribute = WeinanlieferungAttributeModel::findByPk($attributeId);

                if ($attribute === null) {
                    $formattedValues[] = $attributeId . ': ' . (is_array($value) ? implode(', ', $value) : $value);
                    continue;
                }

                // Format based on attribute type
                $attributeTitle = $attribute->title;

                if ($attribute->type === 'option') {
                    // For option type, the value is either true (selected) or false (not selected)
                    if ($value === true || $value === 'true' || $value === '1' || $value === 1) {
                        $formattedValues[] = $attributeTitle . ': Ausgewählt';
                    }
                } else {
                    // Text type or fallback
                    $formattedValues[] = $attributeTitle . ': ' . $value;
                }
            }

            return implode("\n", $formattedValues);
        } catch (\Exception $e) {
            return 'Error parsing attribute values: ' . $e->getMessage();
        }
    }
}