<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
/**
 * Hustle_E_Newsletter class
 *
 * @package Hustle
 */

if ( ! class_exists( 'Hustle_E_Newsletter' ) ) :

	/**
	 * Class Hustle_E_Newsletter
	 */
	class Hustle_E_Newsletter extends Hustle_Provider_Abstract {

		/**
		 * Email Newsletter
		 *
		 * @var Email_Newsletter
		 */
		public $email_newsletter;

		const SLUG = 'e_newsletter';

		/**
		 * Activecampaign Provider Instance
		 *
		 * @since 3.0.5
		 *
		 * @var self|null
		 */
		protected static $instance = null;

		/**
		 * E newsletter
		 *
		 * @since 3.0.5
		 * @var string
		 */
		protected $slug = 'e_newsletter';

		/**
		 * Version
		 *
		 * @since 3.0.5
		 * @var string
		 */
		protected $version = '1.0';

		/**
		 * Class
		 *
		 * @since 3.0.5
		 * @var string
		 */
		protected $class = __CLASS__;

		/**
		 * Title
		 *
		 * @since 3.0.5
		 * @var string
		 */
		protected $title = 'e-Newsletter';

		/**
		 * Is multi on global
		 *
		 * @since 4.0
		 * @var bool
		 */
		protected $is_multi_on_global = false;

		/**
		 * Class name of form settings
		 *
		 * @var string
		 */
		protected $form_settings = 'Hustle_E_Newsletter_Form_Settings';

		/**
		 * Class name of form hooks
		 *
		 * @since 4.0
		 * @var string
		 */
		protected $form_hooks = 'Hustle_E_Newsletter_Form_Hooks';

		/**
		 * Provider constructor.
		 */
		public function __construct() {
			$this->icon_2x = plugin_dir_url( __FILE__ ) . 'images/icon.png';
			$this->logo_2x = plugin_dir_url( __FILE__ ) . 'images/logo.png';
		}

		/**
		 * Get Instance
		 *
		 * @return self|null
		 */
		public static function get_instance() {
			if ( is_null( self::$instance ) ) {
				self::$instance = new self();
			}

			return self::$instance;
		}

		/**
		 * Get the global instance of enewsletter.
		 *
		 * @since 4.0
		 * @return object|null
		 */
		public function get_enewsletter_instance() {
			if ( ! $this->email_newsletter ) {
				global $email_newsletter;
				$this->email_newsletter = $email_newsletter;
			}
			return $this->email_newsletter;
		}

		/**
		 * Is active?
		 *
		 * @return bool
		 */
		public function active() {
			$setting_values = $this->get_settings_values();

			return ! empty( $setting_values['active'] );
		}

		/**
		 * Check if the settings are completed
		 *
		 * @since 4.0
		 * @param string $multi_id Multi ID.
		 * @return boolean
		 */
		protected function settings_are_completed( $multi_id = '' ) {
			return $this->active() && $this->is_plugin_active();
		}

		/**
		 * Get the wizard callbacks for the global settings.
		 *
		 * @since 4.0
		 *
		 * @return array
		 */
		public function settings_wizards() {
			return array(
				array(
					'callback'     => array( $this, 'configure' ),
					'is_completed' => array( $this, 'settings_are_completed' ),
				),
			);
		}


		/**
		 * Configure the API key settings. Global settings.
		 *
		 * @since 4.0
		 *
		 * @param array $submitted_data Submitted data.
		 * @return array
		 */
		public function configure( $submitted_data ) {
			$has_errors = false;
			$active     = $this->active();
			$is_submit  = isset( $submitted_data['hustle_is_submit'] );

			if ( $is_submit ) {

				$active = ! empty( $submitted_data['active'] );
				// If not active, activate it.
				if ( ! Hustle_Provider_Utils::is_provider_active( $this->slug ) ) {

					// TODO: Wrap this in a friendlier method.
					$activated = Hustle_Providers::get_instance()->activate_addon( $this->slug );
					if ( ! $activated ) {
						$error_message = esc_html( $this->provider_connection_falied() );
						$has_errors    = true;
					} else {
						$this->save_settings_values( array( 'active' => $active ) );
					}
				} else {
					$this->save_settings_values( array( 'active' => $active ) );
				}

				if ( ! $has_errors ) {

					return array(
						'html'         => Hustle_Provider_Utils::get_integration_modal_title_markup( __( 'e-Newsletter Added', 'hustle' ), __( 'You can now go to your pop-ups, slide-ins and embeds and assign them to this integration', 'hustle' ) ),
						'buttons'      => array(
							'close' => array(
								'markup' => Hustle_Provider_Utils::get_provider_button_markup( __( 'Close', 'hustle' ), 'sui-button-ghost', 'close' ),
							),
						),
						'redirect'     => false,
						'has_errors'   => false,
						'notification' => array(
							'type' => 'success',
							'text' => '<strong>' . $this->get_title() . '</strong> ' . esc_html__( 'Successfully connected', 'hustle' ),
						),
					);

				}
			}

			if ( ! $this->is_plugin_active() ) {
				$has_errors    = true;
				$error_message = sprintf(
					/* translators: 1. opening 'a' tag to the e-Newsletter github repo, 2. closing 'a' tag */
					esc_html__( 'Please activate e-Newsletter plugin to use this integration. If you don\'t have it installed, %1$sdownload it here%2$s.', 'hustle' ),
					'<a href="https://github.com/wpmudev/e-newsletter" target="_blank">',
					'</a>'
				);
			}

			$options = array(
				array(
					'type'  => 'hidden',
					'name'  => 'active',
					'value' => 1,
				),
			);

			if ( $has_errors ) {

				$step_html = Hustle_Provider_Utils::get_integration_modal_title_markup(
					__( 'Install e-Newsletter', 'hustle' )
				);

				$error_notice = array(
					'type'  => 'notice',
					'icon'  => 'info',
					'class' => 'sui-notice-error',
					'value' => $error_message,
				);
				array_unshift( $options, $error_notice );

			} else {

				$step_html = Hustle_Provider_Utils::get_integration_modal_title_markup(
					__( 'Configure e-Newsletter', 'hustle' ),
					__( 'Activate e-Newsletter to start using it on your forms.', 'hustle' )
				);
			}

			$step_html .= Hustle_Provider_Utils::get_html_for_options( $options );

			$is_edit = $this->is_connected() ? true : false;

			if ( ! $this->is_plugin_active() ) {
				$buttons = array();
			} elseif ( $is_edit ) {
				$buttons = array(
					'disconnect' => array(
						'markup' => Hustle_Provider_Utils::get_provider_button_markup(
							__( 'Disconnect', 'hustle' ),
							'sui-button-ghost',
							'disconnect',
							true
						),
					),
					'close'      => array(
						'markup' => Hustle_Provider_Utils::get_provider_button_markup(
							__( 'Save', 'hustle' ),
							'',
							'close'
						),
					),
				);
			} else {
				$buttons = array(
					'connect' => array(
						'markup' => Hustle_Provider_Utils::get_provider_button_markup(
							__( 'Activate', 'hustle' ),
							'sui-button-center',
							'connect',
							true
						),
					),
				);

			}

			$response = array(
				'html'       => $step_html,
				'buttons'    => $buttons,
				'has_errors' => $has_errors,
			);

			return $response;
		}

		/**
		 * Checks if E-Newsletter plugin is active
		 *
		 * @since 1.1.1
		 * @return bool
		 */
		public function is_plugin_active() {
			return class_exists( 'Email_Newsletter' ) && $this->get_enewsletter_instance();
		}

		/**
		 * Returns groups
		 *
		 * @since 1.1.1
		 * @return array
		 */
		public function get_groups() {
			$e_newsletter = $this->get_enewsletter_instance();
			return (array) $e_newsletter->get_groups();
		}

		/**
		 * Checks if member with given email already exits
		 *
		 * @since 1.1.1
		 *
		 * @param string $email Email.
		 * @return bool
		 */
		public function is_member( $email ) {
			$e_newsletter = $this->get_enewsletter_instance();
			$member       = $e_newsletter->get_member_by_email( $email );
			return ! ! $member;
		}

		/**
		 * Get synced
		 *
		 * @param int $module Module.
		 * @return string
		 */
		public static function get_synced( $module ) {
			return self::get_provider_details( $module, 'synced', self::SLUG );
		}

		/**
		 * Migrate 3.0
		 *
		 * @param object $module Module.
		 * @param object $old_module Old module.
		 * @return boolean
		 */
		public function migrate_30( $module, $old_module ) {
			$migrated = parent::migrate_30( $module, $old_module );
			if ( ! $migrated ) {
				return false;
			}

			/*
			 * Our regular migration would've saved the provider settings in a format that's incorrect for e-newsletter
			 *
			 * Let's fix that now.
			 */
			$module_provider_settings = $module->get_provider_settings( $this->get_slug() );
			if ( ! empty( $module_provider_settings ) ) {
				// At provider level we store a single boolean.
				$this->save_settings_values( array( 'active' => true ) );

				// selected_global_multi_id not needed at module level.
				unset( $module_provider_settings['selected_global_multi_id'] );
				$module->set_provider_settings( $this->get_slug(), $module_provider_settings );
			}

			return $migrated;
		}

		/**
		 * Get 3.0 provider mapping
		 *
		 * @return array
		 */
		public function get_30_provider_mappings() {
			return array(
				'enabled' => 'active',
			);
		}

	}
endif;
