<?php
/**
 * Copyright © 2018 EaDesign by Eco Active S.R.L. All rights reserved.
 * See LICENSE for license details.
 */
namespace Eadesigndev\Awb\Block\Adminhtml\Xtea\Edit\Tab;

use Eadesigndev\Awb\Model\Awb;
use Eadesigndev\Awb\Model\Sources\CarrierType;
use Eadesigndev\Awb\Model\Sources\PaymentMethod;
use Eadesigndev\Awb\Model\Sources\DeliveryPayment;
use Eadesigndev\Awb\Model\Sources\Tariff;
use Eadesigndev\Awb\Model\Sources\PickupId;
use Eadesigndev\Awb\Model\Sources\InputType;
use Magento\Backend\Block\Template\Context;
use Magento\Backend\Block\Widget\Tab\TabInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Data\Form;
use Magento\Framework\Data\FormFactory;
use Magento\Framework\Phrase;
use Magento\Framework\Registry;
use Magento\Backend\Block\Widget\Form\Generic;
use Magento\Config\Model\Config\Source\Yesno;
use Magento\Store\Model\System\Store as SystemStore;
use Eadesigndev\Awb\Model\Sources\ConfigSource;
use Magento\Sales\Api\OrderRepositoryInterface;
/**
 * Class Curier
 * @package Eadesigndev\Awb\Block\Adminhtml\Xtea\Edit\Tab
 */
#[\AllowDynamicProperties] class Curier extends Generic implements TabInterface
{
    /**
     * @var CarrierType
     */
    private $carrierType;

    /**
     * @var PaymentMethod
     */
    private $paymentMethod;

    /**
     * @var DeliveryPayment
     */
    private $deliveryPayment;

    /**
     * @var Tariff
     */
    private $tariff;

    /**
     * @var PickupId
     */
    private $pickupId;

    /**
     * @var InputType
     */
    private $inputType;

    /**
     * @var Yesno
     */
    private $yesNo;

    /**
     * @var SystemStore
     */
    private $systemStore;

    /**
     * @var Registry
     */
    private $registry;

    private $_isEditMode = true;

    public function __construct(
        Context $context,
        Registry $registry,
        FormFactory $formFactory,
        Yesno $yesNo,
        SystemStore $systemStore,
        CarrierType $carrierType,
        PaymentMethod $paymentMethod,
        DeliveryPayment $deliveryPayment,
        Tariff $tariff,
        PickupId $pickupId,
        InputType $inputType,
        ConfigSource $configSource,
        array $data = [],
        ?OrderRepositoryInterface $orderRepository = null

    ) {
        $this->registry        = $registry;
        $this->yesNo           = $yesNo;
        $this->systemStore     = $systemStore;
        $this->carrierType     = $carrierType;
        $this->paymentMethod   = $paymentMethod;
        $this->deliveryPayment = $deliveryPayment;
        $this->tariff          = $tariff;
        $this->pickupId        = $pickupId;
        $this->inputType       = $inputType;
        $this->configSource    = $configSource;
        $this->orderRepository    = $orderRepository ?? ObjectManager::getInstance()->get(OrderRepositoryInterface::class);

        parent::__construct(
            $context,
            $registry,
            $formFactory,
            $data
        );
    }

    /**
     * @return $this
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function _prepareForm()
    {
        /** @var Awb $model */
        $model = $this->registry->registry('awb_data');

        $this->_isEditMode = (($this->getData('block_type') == 'edit' && empty($model->getEntityId())) || $this->getData('block_type') == 'editawb') ? false : true;
        
        if ($carrierId = $model->getCarrierId()) {
            $this->carrierType->setCarrierId($carrierId);
        }
        
        if ($orderId = $model->getOrderId()) {
            $orderObj = $this->orderRepository->get($orderId);
            $payment = $orderObj->getPayment();
            $paymentMethod = $payment->getData('method');
            $repaymentValue = $orderObj->getData('grand_total');

            if ($paymentMethod == 'cashondelivery') {
                $grandTotal = $orderObj->getData('grand_total');
                $totalDue = $orderObj->getData('total_due');
                if ($totalDue < $grandTotal) {
                    $repaymentValue = $orderObj->getData('total_due');
                }
            }
        }

        /** @var Form $form */
        $form = $this->_formFactory->create();

        $fieldSet = $form->addFieldset(
            'base_fieldset',
            ['legend' => __('Info')]
        );

        $types = $this->carrierType->getAvailable(true);


        $carrierIdConfig =             [
            'name' => 'carrier_id',
            'label' => __('Carrier'),
            'title' => __('Carrier'),
            'values' => $types,
            'required' => true,
        ];

        if (!(($this->getData('block_type') == 'edit' && empty($model->getEntityId())) || $this->getData('block_type') == 'editawb')) {
            $carrierIdConfig['readonly'] = true;
        }

        $fieldSet->addField(
            'carrier_id',
            'select',
            $carrierIdConfig
        );

        $defaultValues['payment_method'] = $this->paymentMethod->getDefaultValue();
        $types = $this->paymentMethod->getAvailable();
        $fieldSet->addField(
            'payment_method',
            'hidden',
            [
                'name' => 'payment_method',
                'label' => __('COD Processing Type'),
                'title' => __('COD Processing Type'),
                'values' => $types,
                'required' => false,
            ]
        );

        $defaultValues['tariff_plan'] = $this->tariff->getDefaultValue();
        $types = $this->tariff->getAvailable();
        $fieldSet->addField(
            'tariff_plan',
            'select',
            [
                'name' => 'tariff_plan',
                'label' => __('Tariff plan'),
                'title' => __('Tariff plan'),
                'values' => $types,
                'required' => true,
            ]
        );

        $defaultValues['awb_pickup_id'] = (int)$this->pickupId->getDefaultValue();
        $types = $this->pickupId->getAvailable();
        $fieldSet->addField(
            'awb_pickup_id',
            'select',
            [
                'name' => 'awb_pickup_id',
                'label' => __('Awb Pickup Id'),
                'title' => __('Awb Pickup Id'),
                'values' => $types,
                'required' => true,
            ]
        );

        $defaultValues['delivery_payment'] = $this->deliveryPayment->getDefaultValue();
        $types = $this->deliveryPayment->getAvailable();
        $fieldSet->addField(
            'delivery_payment',
            'select',
            [
                'name' => 'delivery_payment',
                'label' => __('Delivery Payment(Sender/Consignee)'),
                'title' => __('Delivery Payment (Sender/Consignee)'),
                'values' => $types,
                'required' => true,
            ]
        );

        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'weight',
            'text',
            [
                'name' => 'weight',
                'label' => __('Weight'),
                'title' => __('Weight'),
                'values' => $types,
                'required' => true,
            ]
        );

        $defaultValues['packages'] = 1;
        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'packages',
            'text',
            [
                'name' => 'packages',
                'label' => __('Packages'),
                'title' => __('Packages'),
                'values' => $types,
                'required' => false,
            ]
        );

        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'order_id',
            'hidden',
            [
                'name' => 'order_id',
                'label' => __('Order Id'),
                'title' => __('Order Id'),
                'values' => $types,
                'required' => false,
            ]
        );

        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'shipment_id',
            'hidden',
            [
                'name' => 'shipment_id',
                'label' => __('Shipment Id'),
                'title' => __('Shipment Id'),
                'values' => $types,
                'required' => false,
            ]
        );

        $defaultValues['envelopes'] = 0;
        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'envelopes',
            'text',
            [
                'name' => 'envelopes',
                'label' => __('Envelopes'),
                'title' => __('Envelopes'),
                'values' => $types,
                'required' => false,
            ]
        );

        if ($this->carrierType->weNeedThisField('order_value')) {
            $types = $this->inputType->getAvailable();
            $fieldSet->addField(
                'order_value',
                'text',
                [
                    'name' => 'order_value',
                    'label' => __('Value order control'),
                    'title' => __('Value order control'),
                    'values' => $types,
                    'required' => false,
                ]
            );
        }

        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'repayment_value',
            'text',
            [
                'name' => 'repayment_value',
                'label' => __('Repayment value'),
                'title' => __('Repayment value'),
                'values' => $types,
                'required' => true
            ]
        );

        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'content',
            'textarea',
            [
                'name' => 'content',
                'label' => __('Content'),
                'title' => __('Content'),
                'values' => $types,
                'required' => false,
            ]
        );

        $defaultValues['delivery_saturday'] = $this->configSource->getDefaultValue('delivery_saturday');
        $fieldSet->addField(
            'delivery_saturday',
            'select',
            [
                'name' => 'delivery_saturday',
                'label' => __('Saturday delivery'),
                'title' => __('Saturday delivery'),
                'values' => $this->yesNo->toOptionArray(),
                'required' => true,
            ]
        );

        $defaultValues['open_package'] = $this->configSource->getDefaultValue('open_package');
        $fieldSet->addField(
            'open_package',
            'select',
            [
                'name' => 'open_package',
                'label' => __('Open package'),
                'title' => __('Open package'),
                'values' => $this->yesNo->toOptionArray(),
                'required' => true,
            ]
        );

        $types = $this->inputType->getAvailable();
        $fieldSet->addField(
            'comments',
            'textarea',
            [
                'name' => 'comments',
                'label' => __('Comments'),
                'title' => __('Comments'),
                'values' => $types,
                'required' => false,
            ]
        );
        $model->setData('repayment_value', $repaymentValue);
        $form->setValues($model->getData());
        if (!$this->_isEditMode) {
            $form->setValues($model->getData() + $defaultValues);
        }

        $this->setForm($form);

        parent::_prepareForm();

        return $this;
    }

    /**
     * @return Phrase
     */
    public function getTabLabel()
    {
        return __('Curier');
    }

    /**
     * Prepare title for tab
     *
     * @return Phrase
     */
    public function getTabTitle()
    {
        return __('Curier');
    }

    /**
     * @return bool
     */
    public function canShowTab()
    {
        return true;
    }

    /**
     * @return bool
     */
    public function isHidden()
    {
        return false;
    }
}