<?php

namespace Easymailing\App\Core\Provider\GravityForms;

if (!class_exists('GFForms')) {
	return;
}


use GFAddOn;
use GFForms;
use GFCommon;
use Easymailing\App\Utils\MemberPayload;

class GravityFormsIntegration extends GFAddOn {

	protected $_version = EASYMAILING_OFFICIAL_VERSION; // Asume que esta constante está definida en tu plugin
	protected $_min_gravityforms_version = '2.5';
	protected $_slug = 'easymailing-gravityforms';
	protected $_path = 'easymailing-gravityforms/easymailing-gravityforms.php';
	protected $_full_path;
	protected $_title = 'Easymailing Gravity Forms Integration';
	protected $_short_title = 'Easymailing';

	private static $_instance = null;

	/**
	 * Retorna la instancia única del addon.
	 */
	public static function get_instance() {
		if (self::$_instance === null) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}

	/**
	 * Inicializa la integración.
	 */
	public function init() {
		parent::init();
		// Aquí puedes agregar otras acciones o filtros si lo requieres.
	}

	/**
	 * Inicializa la parte frontend para procesar los envíos.
	 */
	public function init_frontend() {
		parent::init_frontend();
		add_action('gform_after_submission', array($this, 'process_submission'), 10, 2);
	}

	/**
	 * Procesa el envío del formulario para enviar los datos a Easymailing.
	 *
	 * @param array $entry Datos del envío.
	 * @param array $form Datos del formulario.
	 */
	public function process_submission($entry, $form) {
		// Se asume que tienes configurado un "feed" para Easymailing en el formulario.
		$feed = $this->get_feed($form['id']);
		if (!$feed) {
			return;
		}

		// Obtén la configuración del feed
		$settings = $feed['meta'];

		// Obtén la configuración del mapeo de campos definida en el feed.
		$fieldsMapping = isset($settings['fields_mapping']) ? $settings['fields_mapping'] : [];

		// Construir el cuerpo de la petición a la API de Easymailing.
		$body = array_merge(MemberPayload::identityFields([
			'email'      => rgar($entry, $this->get_email_field($feed, $form)),
			'phone'      => rgar($entry, $this->get_phone_field($feed, $form)),
			'first_name' => !empty($settings['first_name_field']) ? rgar($entry, $settings['first_name_field']) : '',
			'last_name'  => !empty($settings['last_name_field']) ? rgar($entry, $settings['last_name_field']) : '',
		]), [
			'groups'      => isset($settings['groups']) ? $settings['groups'] : [],
			'client_ip'   => GFCommon::get_ip(),
			'custom_fields' => []
		]);

		if (!MemberPayload::hasIdentity($body)) {
			GFCommon::log_debug(__METHOD__ . ' - Envío omitido: falta email o teléfono.');
			return;
		}

		// Mapear los campos configurados.
		if (!empty($fieldsMapping) && is_array($fieldsMapping)) {
			foreach ($fieldsMapping as $mapping) {
				$local_field_id  = $mapping['local_field_id']  ?? '';
				$remote_field_id = $mapping['remote_field_id'] ?? '';
				if (!$local_field_id || !$remote_field_id) {
					continue;
				}
				$value = rgar($entry, $local_field_id);
				if (empty($value)) {
					continue;
				}

				// Aquí puedes incluir tratamiento especial (por ejemplo, formateo de fechas, campos de aceptación, etc.)
				$body['custom_fields'][] = [
					'field' => $remote_field_id,
					'value' => $value,
				];
			}
		}

		// Opcional: manejo de treatment purposes si se configura en el feed.
		if (!empty($settings['treatment_purposes'])) {
			$body['member_consent'] = [
				'ip'                 => GFCommon::get_ip(),
				'consent_at'         => (new \DateTime("now", new \DateTimeZone("UTC")))->format('Y-m-d\TH:i:s\Z'),
				'treatment_purposes' => $settings['treatment_purposes']
			];
		}

		try {
			// Obtén el cliente API de Easymailing. Se asume que tienes una función o contenedor para ello.
			$api_client = $this->get_api_client();
			$audience   = $settings['audience'] ?? '';
			$api_client->createMember(
				$audience,
				$body,
				!empty($settings['disable_double_opt_in']),
				!empty($settings['disable_sms_double_opt_in'])
			);
			GFCommon::log_debug(__METHOD__ . ' - Miembro de Easymailing creado correctamente.');
		} catch (\Exception $e) {
			GFCommon::log_debug(__METHOD__ . ' - Error al crear miembro en Easymailing: ' . $e->getMessage());
		}
	}

	/**
	 * Retorna el ID del campo email configurado en el feed o lo busca en el formulario.
	 */
	protected function get_email_field($feed, $form) {
		if (!empty($feed['meta']['email_field'])) {
			return $feed['meta']['email_field'];
		}
		// Si no está configurado, se busca el primer campo de tipo email.
		foreach ($form['fields'] as $field) {
			if ($field->type == 'email') {
				return $field->id;
			}
		}
		return null;
	}

	/**
	 * Retorna el ID del campo teléfono configurado en el feed o lo busca en el formulario.
	 */
	protected function get_phone_field($feed, $form) {
		if (!empty($feed['meta']['phone_field'])) {
			return $feed['meta']['phone_field'];
		}
		foreach ($form['fields'] as $field) {
			if ($field->type == 'phone') {
				return $field->id;
			}
		}
		return null;
	}

	/**
	 * Retorna el cliente API de Easymailing.
	 * Ajusta este método para que obtenga la instancia del cliente según tu implementación.
	 */
	protected function get_api_client() {
		if (function_exists('easymailing_get_api_client')) {
			return easymailing_get_api_client();
		}
		throw new \Exception('El cliente API de Easymailing no está disponible.');
	}

}
