/home/arranoyd/mice/wp-content/plugins/fluentform/app/Services/Integrations/IntegrationManager.php
<?php

namespace FluentForm\App\Services\Integrations;

use FluentForm\Framework\Helpers\ArrayHelper;

abstract class IntegrationManager
{
    protected $app = null;
    protected $subscriber = null;
    protected $title = '';
    protected $description = '';
    protected $integrationKey = '';
    protected $optionKey = '';
    protected $settingsKey = '';
    protected $priority = 11;
    public $logo = '';
    public $hasGlobalMenu = true;
    public $category = 'crm';
    public $disableGlobalSettings = 'no';

    public function __construct($app, $title, $integrationKey, $optionKey, $settingsKey, $priority = 11)
    {
        $this->app = $app;
        $this->title = $title;
        $this->integrationKey = $integrationKey;
        $this->optionKey = $optionKey;
        $this->settingsKey = $settingsKey;
        $this->priority = $priority;
    }

    public function registerAdminHooks()
    {
        $isEnabled = $this->isEnabled();

        add_filter('fluentform_global_addons', function ($addons) use ($isEnabled) {
            $addons[$this->integrationKey] = [
                'title'                   => $this->title,
                'category'                => $this->category,
                'disable_global_settings' => $this->disableGlobalSettings,
                'description'             => $this->description,
                'config_url'              => ('yes' != $this->disableGlobalSettings) ? admin_url('admin.php?page=fluent_forms_settings#general-' . $this->integrationKey . '-settings') : '',
                'logo'                    => $this->logo,
                'enabled'                 => ($isEnabled) ? 'yes' : 'no',
            ];
            return $addons;
        }, $this->priority, 1);

        if (! $isEnabled) {
            return;
        }

        $this->registerNotificationHooks();

        // Global Settings Here

        if ($this->hasGlobalMenu) {
            add_filter('fluentform_global_settings_components', [$this, 'addGlobalMenu']);
            add_filter('fluentform_global_integration_settings_' . $this->integrationKey, [$this, 'getGlobalSettings'], $this->priority, 1);
            add_filter('fluentform_global_integration_fields_' . $this->integrationKey, [$this, 'getGlobalFields'], $this->priority, 1);
            add_action('fluentform_save_global_integration_settings_' . $this->integrationKey, [$this, 'saveGlobalSettings'], $this->priority, 1);
        }

        add_filter('fluentform_global_notification_types', [$this, 'addNotificationType'], $this->priority);

        add_filter('fluentform_get_available_form_integrations', [$this, 'pushIntegration'], $this->priority, 2);

        add_filter('fluentform_global_notification_feed_' . $this->settingsKey, [$this, 'setFeedAtributes'], 10, 2);

        add_filter('fluentform_get_integration_defaults_' . $this->integrationKey, [$this, 'getIntegrationDefaults'], 10, 2);
        add_filter('fluentform_get_integration_settings_fields_' . $this->integrationKey, [$this, 'getSettingsFields'], 10, 2);
        add_filter('fluentform_get_integration_merge_fields_' . $this->integrationKey, [$this, 'getMergeFields'], 10, 3);

        add_filter('fluentform_save_integration_settings_' . $this->integrationKey, [$this, 'setMetaKey'], 10, 2);
        add_filter('fluentform_get_integration_values_' . $this->integrationKey, [$this, 'prepareIntegrationFeed'], 10, 3);
    }

    public function registerNotificationHooks()
    {
        if ($this->isConfigured()) {
            add_filter('fluentform_global_notification_active_types', [$this, 'addActiveNotificationType'], $this->priority);
            add_action('fluentform_integration_notify_' . $this->settingsKey, [$this, 'notify'], $this->priority, 4);
        }
    }

    public function notify($feed, $formData, $entry, $form)
    {
        // Each integration have to implement this notify method
        return;
    }

    public function addGlobalMenu($setting)
    {
        $setting[$this->integrationKey] = [
            'hash'         => 'general-' . $this->integrationKey . '-settings',
            'component'    => 'general-integration-settings',
            'settings_key' => $this->integrationKey,
            'title'        => $this->title,
        ];
        return $setting;
    }

    public function addNotificationType($types)
    {
        $types[] = $this->settingsKey;
        return $types;
    }

    public function addActiveNotificationType($types)
    {
        $types[$this->settingsKey] = $this->integrationKey;
        return $types;
    }

    public function getGlobalSettings($settings)
    {
        return $settings;
    }

    public function saveGlobalSettings($settings)
    {
        return $settings;
    }

    public function getGlobalFields($fields)
    {
        return $fields;
    }

    public function setMetaKey($data, $integrationId)
    {
        $data['meta_key'] = $this->settingsKey;
        return $data;
    }

    public function prepareIntegrationFeed($setting, $feed, $formId)
    {
        $defaults = $this->getIntegrationDefaults([], $formId);

        foreach ($setting as $settingKey => $settingValue) {
            if ('true' == $settingValue) {
                $setting[$settingKey] = true;
            } elseif ('false' == $settingValue) {
                $setting[$settingKey] = false;
            } elseif ('conditionals' == $settingKey) {
                if ('true' == $settingValue['status']) {
                    $settingValue['status'] = true;
                } elseif ('false' == $settingValue['status']) {
                    $settingValue['status'] = false;
                }
                $setting['conditionals'] = $settingValue;
            }
        }

        if (! empty($setting['list_id'])) {
            $setting['list_id'] = (string) $setting['list_id'];
        }

        return wp_parse_args($setting, $defaults);
    }

    abstract public function getIntegrationDefaults($settings, $formId);

    abstract public function pushIntegration($integrations, $formId);

    abstract public function getSettingsFields($settings, $formId);

    abstract public function getMergeFields($list, $listId, $formId);

    public function setFeedAtributes($feed, $formId)
    {
        $feed['provider'] = $this->integrationKey;
        $feed['provider_logo'] = $this->logo;
        return $feed;
    }

    public function isConfigured()
    {
        $globalStatus = $this->getApiSettings();
        return $globalStatus && $globalStatus['status'];
    }

    public function isEnabled()
    {
        $globalModules = get_option('fluentform_global_modules_status');
        return $globalModules && isset($globalModules[$this->integrationKey]) && 'yes' == $globalModules[$this->integrationKey];
    }

    public function getApiSettings()
    {
        $settings = get_option($this->optionKey);
        if (! $settings || empty($settings['status'])) {
            $settings = [
                'apiKey' => '',
                'status' => false,
            ];
        }
        return $settings;
    }

    protected function getSelectedTagIds($data, $inputData, $simpleKey = 'tag_ids', $routingId = 'tag_ids_selection_type', $routersKey = 'tag_routers')
    {
        $routing = ArrayHelper::get($data, $routingId, 'simple');
        if (! $routing || 'simple' == $routing) {
            return ArrayHelper::get($data, $simpleKey, []);
        }

        $routers = ArrayHelper::get($data, $routersKey);
        if (empty($routers)) {
            return [];
        }

        return $this->evaluateRoutings($routers, $inputData);
    }

    protected function evaluateRoutings($routings, $inputData)
    {
        $validInputs = [];
        foreach ($routings as $routing) {
            $inputValue = ArrayHelper::get($routing, 'input_value');
            if (! $inputValue) {
                continue;
            }
            $condition = [
                'conditionals' => [
                    'status'     => true,
                    'is_test'    => true,
                    'type'       => 'any',
                    'conditions' => [
                        $routing,
                    ],
                ],
            ];

            if (\FluentForm\App\Services\ConditionAssesor::evaluate($condition, $inputData)) {
                $validInputs[] = $inputValue;
            }
        }

        return $validInputs;
    }
}