<?php

namespace WP_Statistics\Service\Integrations;

use WP_STATISTICS\Menus;
use WP_STATISTICS\Option;
use WP_Statistics\Service\Integrations\Plugins\WpConsentApi;
use WP_Statistics\Service\Integrations\Plugins\RealCookieBanner;
use WP_Statistics\Service\Integrations\Plugins\BorlabsCookie;
use WP_Statistics\Service\Integrations\Plugins\AbstractIntegration;


class IntegrationHelper
{
    /**
     * List of integrations to register.
     * @var AbstractIntegration[]
     */
    public static $integrations = [
        WpConsentApi::class,
        RealCookieBanner::class,
        BorlabsCookie::class,
    ];

    /**
     * Get an integration class by name.
     *
     * @param string $integration The name of the integration (e.g. "wp_consent_api").
     * @return AbstractIntegration|false
     */
    public static function getIntegration($integration)
    {
        foreach (self::$integrations as $class) {
            $class = new $class();

            if ($class->getKey() === $integration) {
                return $class;
            }
        }

        return false;
    }

    /**
     * Return an array of all integrations.
     *
     * @return AbstractIntegration[]
     */
    public static function getAllIntegrations()
    {
        $integrations = [];

        foreach (self::$integrations as $class) {
            $integration = new $class();

            $integrations[] = $integration;
        }

        return $integrations;
    }

    /**
     * Returns the currently active integration class.
     *
     * @return AbstractIntegration|false False if no integration is selected.
     */
    public static function getActiveIntegration()
    {
        $integration = Option::get('consent_integration');
        $integration = self::getIntegration($integration);

        return !empty($integration) && $integration->isActive()
            ? $integration
            : false;
    }

    /**
     * Checks if certain integration is active
     *
     * @param string $integration
     * @return bool
     */
    public static function isIntegrationActive($integration)
    {
        $activeIntegration = self::getActiveIntegration();
        return !empty($activeIntegration) && ($activeIntegration->getKey() === $integration);
    }

    /**
     * Returns the currently selected integration status.
     *
     * @return array
     */
    public static function getIntegrationStatus()
    {
        $status = [
            'name'      => null,
            'status'    => []
        ];

        $integration = self::getActiveIntegration();

        if (!empty($integration)) {
            $status['name']     = $integration->getKey();
            $status['status']   = $integration->getStatus();
        }

        return $status;
    }

    /**
     * Checks if consent is given for the currently active integration.
     *
     * If there's no active integration, it assumes consent is given.
     *
     * @return bool
     */
    public static function isConsentGiven()
    {
        $integration = self::getActiveIntegration();

        return empty($integration) || $integration->hasConsent();
    }

    /**
     * Checks if the currently active integration requires anonymous tracking.
     *
     * If there's no active integration, it assumes it doesn't require anonymous tracking.
     *
     * @return bool
     */
    public static function shouldTrackAnonymously()
    {
        $integration = self::getActiveIntegration();

        return !empty($integration) && $integration->trackAnonymously();
    }

    /**
     * Checks all integrations for active consent plugins and returns a list of notices.
     *
     * @return array
     */
    public static function getDetectionNotice()
    {
        $notices = [];

        if (Option::get('consent_integration')) return $notices;

        foreach (self::getAllIntegrations() as $integration) {
            // If conditions to show notice is not met, continue
            if (!$integration->showNotice()) continue;

            $notices[] = [
                'key'     => $integration->getKey(),
                'title'   => esc_html__('WP Statistics - Consent Plugin Detected', 'wp-statistics'),
                'content' => sprintf(
                    '%s <br> %s · %s',
                    sprintf(
                        /* translators: %s: string value */
                        __('We’ve detected <b>%s</b> on your site. To ensure WP Statistics respects visitor consent preferences, you can enable integration with this plugin.', 'wp-statistics'),
                        $integration->getName()
                    ),
                    '<a href="' . esc_url(Menus::admin_url('settings', ['tab' => 'privacy-settings']) . '#consent_integration') . '">' . esc_html__('Activate integration ›', 'wp-statistics') . '</a>',
                    '<a target="_blank" href="https://wp-statistics.com/resources/integrating-wp-statistics-with-consent-management-plugins/?utm_source=wp-statistics&utm_medium=link&utm_campaign=privacy">' . esc_html__('Learn More ›', 'wp-statistics') . '</a>'
                )
            ];
        }

        return $notices;
    }
}
