<?php
/*
 * @package    ECLCDEK shipping plugin СДЭК to RadicalMart
 * @subpackage    ECLCDEK
 * @version    1.0.1
 * @author Econsult Lab.
 * @copyright  Copyright (c) 2025 Econsult Lab. All rights reserved.
 * @license    GNU/GPL license: https://www.gnu.org/copyleft/gpl.html
 * @link       https://econsultlab.ru
 */

namespace Joomla\Plugin\RadicalMartShipping\ECLCDEK\Field;

use Joomla\CMS\Form\Field\ListField;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

class TariffsListField extends ListField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  1.7.0
	 */
	protected $type = 'TariffsList';

	/**
	 * Тип группы тарифов (office, door, pickup)
	 * @var string
	 * @since version
	 */
	protected $tariff_type ="office";

	/**
	 * Method to get certain otherwise inaccessible properties from the form field object.
	 *
	 * @param   string  $name  The property name for which to get the value.
	 *
	 * @return  mixed  The property value or null.
	 *
	 * @since   3.2
	 */
	public function __get($name)
	{
		return match ($name)
		{
			'tariff_type' => $this->$name,
			default => parent::__get($name),
		};
	}

	/**
	 * Method to set certain otherwise inaccessible properties of the form field object.
	 *
	 * @param   string  $name   The property name for which to set the value.
	 * @param   mixed   $value  The value of the property.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function __set($name, $value)
	{
		switch ($name) {
			case 'tariff_type':
				if(!in_array($value,['office','door','pickup'])){
					$value = 'office';
				}
				$this->$name = (string) $value;
				break;
			default:
				parent::__set($name, $value);
		}
	}

	/**
	 * Method to attach a Form object to the field.
	 *
	 * @param   \SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` tag for the form field object.
	 * @param   mixed              $value    The form field value to validate.
	 * @param   string             $group    The field name group control value. This acts as an array container for the field.
	 *                                       For example if the field has name="foo" and the group value is set to "bar" then the
	 *                                       full field name would end up being "bar[foo]".
	 *
	 * @return  boolean  True on success.
	 *
	 * @see     FormField::setup()
	 * @since   5.1.0
	 */
	public function setup(\SimpleXMLElement $element, $value, $group = null)
	{
		$return = parent::setup($element, $value, $group);

		if ($return) {
			// Check if it's using the old way
			$this->tariff_type = (string) $this->element['tariff_type'] ?: "office";
		}

		return $return;
	}

	/**
	 * Method to get the custom field options.
	 * Use the query attribute to supply a query to generate the list.
	 *
	 * @return  object[]  The field option objects.
	 *
	 * @since   1.7.0
	 */
	protected function getOptions(){
		// Build the field options.
		$items = $this->loadTariffs();
		$options = array();
		$options[] = HTMLHelper::_('select.option', "", Text::_("JSELECT"));
		if (!empty($items) && isset($items[$this->tariff_type])) {
			foreach ($items[$this->tariff_type] as $item) {
				if ($this->translate == true) {
					$options[] = HTMLHelper::_('select.option', $item["code"], Text::_($item["name"]));
				} else {
					$options[] = HTMLHelper::_('select.option', $item["code"], $item["name"]);
				}
			}
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}

	protected function loadTariffs(): array
	{
		return array(
			"door"     => array(
				array("code" => 7, "name" => "Международный экспресс документы дверь-дверь (до 5кг)"),
				array("code" => 8, "name" => "Международный экспресс грузы дверь-дверь (до 30кг)"),
				array("code" => 137, "name" => "Посылка склад-дверь (до 50кг)"),
				array("code" => 139, "name" => "Посылка дверь-дверь (до 50кг)"),
				array("code" => 231, "name" => "Экономичная посылка дверь-дверь (до 50кг)"),
				array("code" => 233, "name" => "Экономичная посылка склад-дверь (до 50кг)"),
				array("code" => 239, "name" => "E-com Express дверь-дверь (до 500кг)"),
				array("code" => 294, "name" => "E-com Express склад-дверь (до 500кг)"),
				array("code" => 184, "name" => "E-com Standard дверь-дверь"),
				array("code" => 186, "name" => "E-com Standard склад-дверь"),
			),
			"office"   => array(
				array("code" => 136, "name" => "Посылка склад-склад (до 50кг)"),
				array("code" => 138, "name" => "Посылка дверь-склад (до 50кг)"),
				array("code" => 232, "name" => "Экономичная посылка дверь-склад (до 50кг)"),
				array("code" => 234, "name" => "Экономичная посылка склад-склад (до 50кг)"),
				array("code" => 291, "name" => "E-com Express склад-склад (до 500кг)"),
				array("code" => 295, "name" => "E-com Express дверь-склад (до 50кг)"),
				array("code" => 185, "name" => "E-com Standard склад-склад"),
				array("code" => 187, "name" => "E-com Standard дверь-склад"),
			),
			"pickup" => array(
				array("code" => 509, "name" => "E-com Express дверь-постамат"),
				array("code" => 510, "name" => "E-com Express склад-постамат"),
				array("code" => 366, "name" => "Посылка дверь-постамат"),
				array("code" => 368, "name" => "Посылка склад-постамат"),
				array("code" => 378, "name" => "Экономичная посылка склад-постамат"),
				array("code" => 497, "name" => "E-com Standard дверь-постамат"),
				array("code" => 498, "name" => "E-com Standard склад-постамат"),
			)
		);
	}
}