<?php

namespace Planaday\Config\General\Debug;

use Planaday\Config\BasicEnumMappedSetting;
use Planaday\Config\BasicSettingsLog;
use Planaday\Config\EnumMappedSettings;
use Planaday\Config\FormGroupable;
use Planaday\Config\SettingsLoader;
use Planaday\Config\SettingsWithForm;
use Planaday\Config\SettingsWithUsageLog;
use Planaday\Platform\PlatformAbstraction\LocalizationController;
use Planaday\Utility\DependencyInjection\Attributes\Scoped;
use Planaday\Utility\FormBuilder\Conditions\InputValueCondition;
use Planaday\Utility\FormBuilder\InputFields\BoolInput;
use Planaday\Utility\FormBuilder\InputFields\StringInput;
use Planaday\Utility\FormBuilder\LayoutItems\Text;
use Planaday\Utility\FormBuilder\Structures\BasicGroup;

#[Scoped]
class DebugSettings implements EnumMappedSettings, SettingsWithForm, SettingsWithUsageLog {
	use FormGroupable;
	use BasicEnumMappedSetting;
	use BasicSettingsLog;

	private bool $sendDebugLogs = false;
	private bool $enableFontAwesome = true;
	private string $baseUrlOverride = '';
	private bool $urlRegistration = true;

	public function __construct(
		protected LocalizationController $translator,
		protected SettingsLoader $settingsDatabase
	) {
		$this->settingsDatabase->reloadData($this, DebugOptionsEnum::class );
	}

	protected function createFormGroup(): BasicGroup {
		$t = function ( string $string ) {
			return $this->translator->translate( $string );
		};

		return ( new BasicGroup() )
			->setIndex( DebugOptionsEnum::class )
			->addContents(
				( new BasicGroup() )
					->addContents(
						$enableFontAwesome = ( new BoolInput() )
							->setIndex( DebugOptionsEnum::ENABLE_FONT_AWESOME->value )
							->setName( $t( 'Font Awesome meegeven' ) )
							->setDescription( $t( 'Door dit uit te zetten wordt font awesome niet meegegeven.' ) )
							->setDefaultValue( $this->enableFontAwesome )
							->addSetCallback( function ($value ) {
								$this->enableFontAwesome = $value ?? $this->enableFontAwesome;
							}),
						( new BasicGroup() )
							->addConditions(
								( new InputValueCondition( $enableFontAwesome ) )->equals()->value( false )
							)->addContents(
								( new Text( $t( 'LET OP: Font Awesome wordt gebruikt in de plugin, dit moet ' .
								                'aangelaten worden tenzij een andere plugin of thema al Font Awesome meegeeft.')))
									->addClasses( 'pad-warning' )
							)
					),
				( new BasicGroup() )
					->addContents(
						$sendDebugLogs = ( new BoolInput() )
							->setIndex( DebugOptionsEnum::SEND_DEBUG_LOGS->value )
							->setName( $t( 'Debug logs meegeven naar gebruiker' ) )
							->setDescription( $t( 'Door deze optie aan te zetten worden de debug logs mee ' .
							                      'gestuurd om zichtbaar te zijn voor de admin.' ) )
							->setDefaultValue( $this->sendDebugLogs )
							->addSetCallback( function ( $value ) {
								$this->sendDebugLogs = $value ?? $this->sendDebugLogs;
							} ),
						( new BasicGroup() )
							->addConditions(
								( new InputValueCondition( $sendDebugLogs ) )->equals()->value( true )
							)->addContents(
								( new Text( $t( 'LET OP: Het meesturen van de debug logs kan performance ' .
								                'problemen met zich mee brengen, er wordt aangeraden dit alleen aan te' .
								                ' zetten op instructie van Planaday support.' ) ) )
									->addClasses( 'pad-warning' )
							)
					),
				( new BasicGroup() )
					->addContents(
						$baseUrlOverride = ( new StringInput() )
							->setIndex( DebugOptionsEnum::BASE_URL_OVERRIDE->value )
							->setName( $t( 'Webhook domein overschrijven' ) )
							->setDescription( $t( 'Als het domein van de website niet overeenkomt met waar de ' .
							                      'webhooks vandaan bereikt kunnen worden dan kan met deze optie een ' .
							                      'ander domein worden meegegeven.') )
							->setPlaceholder( 'https://www.uwdomein.com' )
							->setDefaultValue( $this->baseUrlOverride )
							->addSetCallback( function ( $value ) {
								$this->baseUrlOverride = $value ?? $this->baseUrlOverride;
							} ),
						( new BasicGroup() )
							->addConditions(
								( new InputValueCondition( $baseUrlOverride ) )->greaterThan()->value('')
							)->addContents(
								( new Text( $t( 'LET OP: Als dit aangepast wordt naar het verkeerde domein gaan ' .
								                'meerdere onderdelen van de plugin stuk. Er wordt aangeraden dit ' .
								                'alleen aan te passen op instructie van Planaday support.' ) ) )
									->addClasses( 'pad-warning' )
							)
					),
				( new BasicGroup() )
					->addContents(
						$urlRegister = ( new BoolInput() )
							->setIndex( DebugOptionsEnum::UrlRegistration->value )
							->setName( $t( 'Registreer het url van deze website' ) )
							->setDescription( $t( 'Door deze optie uit te zetten wordt de website niet ' .
							                      'geregistreerd bij de backoffice en werkt sommige functionaliteit ' .
							                      'niet meer.') )
							->setDefaultValue( $this->urlRegistration )
							->addSetCallback( function ( $value ) {
								$this->urlRegistration = $value ?? $this->urlRegistration;
							} ),
						( new BasicGroup() )
							->addConditions(
								( new InputValueCondition( $urlRegister ) )->equals()->value( false )
							)->addContents(
								( new Text( $t( 'LET OP: Het niet registreren van het url van de website kan ' .
								                'problemen met zich meebrengen, er wordt aangeraden dit alleen uit te' .
								                ' zetten op instructie van Planaday support.' ) ) )
									->addClasses( 'pad-warning' )
							)
					),
			);
	}

	/**
	 * @return array{values:mixed[], subGroups:array[], subGroupAliases:string[]}
	 */
	public function getEnumMapping(): array {
		return [
			"values"          => [
				DebugOptionsEnum::SEND_DEBUG_LOGS->value => &$this->sendDebugLogs,
				DebugOptionsEnum::ENABLE_FONT_AWESOME->value => &$this->enableFontAwesome,
				DebugOptionsEnum::BASE_URL_OVERRIDE->value => &$this->baseUrlOverride,
				DebugOptionsEnum::UrlRegistration->value => &$this->urlRegistration
			],
			"subGroups"       => [],
			"subGroupAliases" => []
		];
	}

	public function isSendDebugLogs(): bool {
		$this->logUse( DebugOptionsEnum::SEND_DEBUG_LOGS );
		return $this->sendDebugLogs;
	}

	public function isEnableFontAwesome(): bool {
		$this->logUse(DebugOptionsEnum::ENABLE_FONT_AWESOME);
		return $this->enableFontAwesome;
	}

	public function getBaseUrlOverride(): string {
		$this->logUse(DebugOptionsEnum::BASE_URL_OVERRIDE);
		return $this->baseUrlOverride;
	}

	public function isUrlRegistration(): bool {
		$this->logUse(DebugOptionsEnum::UrlRegistration);
		return $this->urlRegistration;
	}
}