<?php

namespace Duplicator\Utils\ExtraPlugins;

final class ExtraPluginsMng
{
    /** @var ?self */
    private static $instance = null;

    /** @var array<string, ExtraItem> key slug item */
    protected $plugins = array();

    /**
     *
     * @return self
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * Singleton constructor
     */
    protected function __construct()
    {
        $this->plugins = self::getInitList();
    }

    /**
     * Execute callback for each plugin
     *
     * @param callable $callback callback function
     *
     * @return void
     */
    public function foreachCallback($callback)
    {
        if (!is_callable($callback)) {
            return;
        }

        foreach ($this->plugins as $plugin) {
            call_user_func($callback, $plugin);
        }
    }

    /**
     * Get all plugins
     *
     * @return ExtraItem[] All plugin items
     */
    public function getAll()
    {
        return $this->plugins;
    }

    /**
     * Returns plugin by slug
     *
     * @param string $slug plugin slug
     *
     * @return false|ExtraItem plugin item or false if not found
     */
    public function getBySlug($slug)
    {
        if (strlen($slug) === 0) {
            return false;
        }

        if (!isset($this->plugins[$slug])) {
            return false;
        }

        return (isset($this->plugins[$slug]) ? $this->plugins[$slug] : false);
    }

    /**
     * Install plugin slug
     *
     * @param string $slug    plugin slug
     * @param string $message message
     *
     * @return bool true if plugin installed and activated or false on failure
     */
    public function install($slug, &$message = '')
    {
        if (strlen($slug) === 0) {
            $message = __('Plugin slug is empty', 'duplicator');
            return false;
        }

        if (($plugin = $this->getBySlug($slug)) == false) {
            $message = __('Plugin not found', 'duplicator');
            return false;
        }

        $result = true;
        ob_start();
        if ($plugin->install() == false) {
            $result = false;
        } elseif ($plugin->activate() == false) {
            $result = false;
        }
        $message = ob_get_clean();
        return $result;
    }

    /**
     * Init addon plugins
     *
     * @return void
     */
    private static function getInitList()
    {
        $result = array();

        $item = new ExtraItem(
            __('OptinMonster', 'duplicator'),
            'optinmonster/optin-monster-wp-api.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-om.png',
            __('Instantly get more subscribers, leads, and sales with the #1 conversion optimization toolkit. Create ' .
                'high converting popups, announcement bars, spin a wheel, and more with smart targeting and personalization.', 'duplicator'),
            'https://downloads.wordpress.org/plugin/optinmonster.zip',
            'https://wordpress.org/plugins/optinmonster/'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('MonsterInsights', 'duplicator'),
            'google-analytics-for-wordpress/googleanalytics.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-mi.png',
            __(
                'The leading WordPress analytics plugin that shows you how people find and use your website, so you can ' .
                'make data driven decisions to grow your business. Properly set up Google Analytics without writing code.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/google-analytics-for-wordpress.zip',
            'https://wordpress.org/plugins/google-analytics-for-wordpress/'
        );
        $item->setPro(
            __('MonsterInsights Pro', 'duplicator'),
            'google-analytics-premium/googleanalytics-premium.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-mi.png',
            __(
                'The leading WordPress analytics plugin that shows you how people find and use your website, so you ' .
                'can make data driven decisions to grow your business. Properly set up Google Analytics without writing code.',
                'duplicator'
            ),
            'https://www.monsterinsights.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('WPForms', 'duplicator'),
            'wpforms-lite/wpforms.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-wpforms.png',
            __(
                'The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment ' .
                'forms, and more with our 100+ form templates. Trusted by over 4 million websites as the best forms plugin.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/wpforms-lite.zip',
            'https://wordpress.org/plugins/wpforms-lite/'
        );
        $item->setPro(
            __('WPForms Pro', 'duplicator'),
            'wpforms/wpforms.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-wpforms.png',
            __(
                'The easiest drag & drop WordPress form builder plugin to create beautiful contact forms, subscription ' .
                'forms, payment forms, and more in minutes. No coding skills required.',
                'duplicator'
            ),
            'https://wpforms.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('WP Mail SMTP', 'duplicator'),
            'wp-mail-smtp/wp_mail_smtp.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-smtp.png',
            __(
                'Improve your WordPress email deliverability and make sure that your website emails reach user\'s inbox ' .
                'with the #1 SMTP plugin for WordPress. Over 3 million websites use it to fix WordPress email issues.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip',
            'https://wordpress.org/plugins/wp-mail-smtp/'
        );
        $item->setPro(
            __('WP Mail SMTP Pro', 'duplicator'),
            'wp-mail-smtp-pro/wp_mail_smtp.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-smtp.png',
            __(
                'Improve your WordPress email deliverability and make sure that your website emails reach user\'s inbox ' .
                'with the #1 SMTP plugin for WordPress. Over 3 million websites use it to fix WordPress email issues.',
                'duplicator'
            ),
            'https://wpmailsmtp.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('AIOSEO', 'duplicator'),
            'all-in-one-seo-pack/all_in_one_seo_pack.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-aioseo.png',
            __(
                'The original WordPress SEO plugin and toolkit that improves your website\'s search rankings. Comes with ' .
                'all the SEO features like Local SEO, WooCommerce SEO, sitemaps, SEO optimizer, schema, and more.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip',
            'https://wordpress.org/plugins/all-in-one-seo-pack/'
        );
        $item->setPro(
            __('AIOSEO Pro', 'duplicator'),
            'all-in-one-seo-pack-pro/all_in_one_seo_pack.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-aioseo.png',
            __(
                'The original WordPress SEO plugin and toolkit that improves your website\'s search rankings. Comes ' .
                'with all the SEO features like Local SEO, WooCommerce SEO, sitemaps, SEO optimizer, schema, and more.',
                'duplicator'
            ),
            'https://aioseo.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item =  new ExtraItem(
            __('SeedProd', 'duplicator'),
            'coming-soon/coming-soon.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-seedprod.png',
            __('The best WordPress coming soon page plugin to create a beautiful coming soon page, maintenance mode page, ' .
                'or landing page. No coding skills required.', 'duplicator'),
            'https://downloads.wordpress.org/plugin/coming-soon.zip',
            'https://wordpress.org/plugins/coming-soon/'
        );
        $item->setPro(
            __('SeedProd Pro', 'duplicator'),
            'seedprod-coming-soon-pro-5/seedprod-coming-soon-pro-5.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-seedprod.png',
            __('The best WordPress coming soon page plugin to create a beautiful coming soon page, maintenance mode ' .
                'page, or landing page. No coding skills required.', 'duplicator'),
            'https://www.seedprod.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('RafflePress', 'duplicator'),
            'rafflepress/rafflepress.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-rp.png',
            __(
                'Turn your website visitors into brand ambassadors! Easily grow your email list, website traffic, and social ' .
                'media followers with the most powerful giveaways & contests plugin for WordPress.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/rafflepress.zip',
            'https://wordpress.org/plugins/rafflepress/'
        );
        $item->setPro(
            __('RafflePress Pro', 'duplicator'),
            'rafflepress-pro/rafflepress-pro.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-rp.png',
            __(
                'Turn your website visitors into brand ambassadors! Easily grow your email list, website traffic, and ' .
                'social media followers with the most powerful giveaways & contests plugin for WordPress.',
                'duplicator'
            ),
            'https://rafflepress.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('PushEngage', 'duplicator'),
            'pushengage/main.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-pushengage.png',
            __(
                'Connect with your visitors after they leave your website with the leading web push notification software. ' .
                'Over 10,000+ businesses worldwide use PushEngage to send 9 billion notifications each month.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/pushengage.zip',
            'https://wordpress.org/plugins/pushengage/'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Smash Balloon Instagram Feeds', 'duplicator'),
            'instagram-feed/instagram-feed.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-instagram.png',
            __(
                'Easily display Instagram content on your WordPress site without writing any code. Comes with multiple templates, ' .
                'ability to show content from multiple accounts, hashtags, and more. Trusted by 1 million websites.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/instagram-feed.zip',
            'https://wordpress.org/plugins/instagram-feed/'
        );
        $item->setPro(
            __('Smash Balloon Instagram Feeds Pro', 'duplicator'),
            'instagram-feed-pro/instagram-feed.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-instagram.png',
            __(
                'Easily display Instagram content on your WordPress site without writing any code. Comes with multiple ' .
                'templates, ability to show content from multiple accounts, hashtags, and more. Trusted by 1 million websites.',
                'duplicator'
            ),
            'https://smashballoon.com/instagram-feed/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Smash Balloon Facebook Feeds', 'duplicator'),
            'custom-facebook-feed/custom-facebook-feed.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-fb.png',
            __(
                'Easily display Facebook content on your WordPress site without writing any code. Comes with multiple templates, ' .
                'ability to embed albums, group content, reviews, live videos, comments, and reactions.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/custom-facebook-feed.zip',
            'https://wordpress.org/plugins/custom-facebook-feed/'
        );
        $item->setPro(
            __('Smash Balloon Facebook Feeds Pro', 'duplicator'),
            'custom-facebook-feed-pro/custom-facebook-feed.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-fb.png',
            __(
                'Easily display Facebook content on your WordPress site without writing any code. Comes with multiple templates, ' .
                'ability to embed albums, group content, reviews, live videos, comments, and reactions.',
                'duplicator'
            ),
            'https://smashballoon.com/custom-facebook-feed/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Smash Balloon Twitter Feeds', 'duplicator'),
            'custom-twitter-feeds/custom-twitter-feed.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-twitter.png',
            __(
                'Easily display Twitter content in WordPress without writing any code. Comes with multiple layouts, ability ' .
                'to combine multiple Twitter feeds, Twitter card support, tweet moderation, and more.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/custom-twitter-feeds.zip',
            'https://wordpress.org/plugins/custom-twitter-feeds/'
        );
        $item->setPro(
            __('Smash Balloon Twitter Feeds Pro', 'duplicator'),
            'custom-twitter-feeds-pro/custom-twitter-feeds.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-twitter.png',
            __(
                'Easily display Twitter content in WordPress without writing any code. Comes with multiple layouts, ' .
                'ability to combine multiple Twitter feeds, Twitter card support, tweet moderation, and more.',
                'duplicator'
            ),
            'https://smashballoon.com/custom-twitter-feeds/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Smash Balloon YouTube Feeds', 'duplicator'),
            'feeds-for-youtube/youtube-feed.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-youtube.png',
            __(
                'Easily display YouTube videos on your WordPress site without writing any code. Comes with multiple layouts, ' .
                'ability to embed live streams, video filtering, ability to combine multiple channel videos, and more.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/feeds-for-youtube.zip',
            'https://wordpress.org/plugins/feeds-for-youtube/'
        );
        $item->setPro(
            __('Smash Balloon YouTube Feeds Pro', 'duplicator'),
            'youtube-feed-pro/youtube-feed.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sb-youtube.png',
            __(
                'Easily display YouTube videos on your WordPress site without writing any code. Comes with multiple ' .
                'layouts, ability to embed live streams, video filtering, ability to combine multiple channel videos, and more.',
                'duplicator'
            ),
            'https://smashballoon.com/youtube-feed/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item =  new ExtraItem(
            __('TrustPulse', 'duplicator'),
            'trustpulse-api/trustpulse.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-trustpulse.png',
            __(
                'Boost your sales and conversions by up to 15% with real-time social proof notifications. TrustPulse helps ' .
                'you show live user activity and purchases to help convince other users to purchase.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/trustpulse-api.zip',
            'https://wordpress.org/plugins/trustpulse-api/'
        );

        $result[$item->getSlug()] = $item;


        $item = new ExtraItem(
            __('SearchWP', 'duplicator'),
            'searchwp/index.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-searchwp.png',
            __(
                'The most advanced WordPress search plugin. Customize your WordPress search algorithm, reorder search results, ' .
                'track search metrics, and everything you need to leverage search to grow your business.',
                'duplicator'
            ),
            'https://searchwp.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('AffiliateWP', 'duplicator'),
            'affiliate-wp/affiliate-wp.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-affwp.png',
            __(
                'The #1 affiliate management plugin for WordPress. Easily create an affiliate program for your eCommerce ' .
                'store or membership site within minutes and start growing your sales with the power of referral marketing.',
                'duplicator'
            ),
            'https://affiliatewp.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator',
            false
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('WP Simple Pay', 'duplicator'),
            'stripe/stripe-checkout.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-wp-simple-pay.png',
            __(
                'The #1 Stripe payments plugin for WordPress. Start accepting one-time and recurring payments on your ' .
                'WordPress site without setting up a shopping cart. No code required.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/stripe.zip',
            'https://wordpress.org/plugins/stripe/'
        );
        $item->setPro(
            __('WP Simple Pay Pro', 'duplicator'),
            'wp-simple-pay-pro-3/simple-pay.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-wp-simple-pay.png',
            __(
                'The #1 Stripe payments plugin for WordPress. Start accepting one-time and recurring payments on your ' .
                'WordPress site without setting up a shopping cart. No code required.',
                'duplicator'
            ),
            'https://wpsimplepay.com/lite-upgrade/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );
        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Easy Digital Downloads', 'duplicator'),
            'easy-digital-downloads/easy-digital-downloads.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-edd.png',
            __('The best WordPress eCommerce plugin for selling digital downloads. Start selling eBooks, software, music, ' .
                'digital art, and more within minutes. Accept payments, manage subscriptions, advanced access control, and more.', 'duplicator'),
            'https://downloads.wordpress.org/plugin/easy-digital-downloads.zip',
            'https://wordpress.org/plugins/easy-digital-downloads/'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Sugar Calendar', 'duplicator'),
            'sugar-calendar-lite/sugar-calendar-lite.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sugarcalendar.png',
            __('A simple & powerful event calendar plugin for WordPress that comes with all the event management features ' .
                'including payments, scheduling, timezones, ticketing, recurring events, and more.', 'duplicator'),
            'https://downloads.wordpress.org/plugin/sugar-calendar-lite.zip',
            'https://wordpress.org/plugins/sugar-calendar-lite/'
        );
        $item->setPro(
            __('Sugar Calendar Pro', 'duplicator'),
            'sugar-calendar/sugar-calendar.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-sugarcalendar.png',
            __('A simple & powerful event calendar plugin for WordPress that comes with all the event management features ' .
                'including payments, scheduling, timezones, ticketing, recurring events, and more.', 'duplicator'),
            'https://sugarcalendar.com/?utm_source=duplicatorplugin&utm_medium=link&utm_campaign=About%20Duplicator'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('WPCode', 'duplicator'),
            'insert-headers-and-footers/ihaf.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-wpcode.png',
            __('Future proof your WordPress customizations with the most popular code snippet management plugin for WordPress. ' .
            'Trusted by over 1,500,000+ websites for easily adding code to WordPress right from the admin area.', 'duplicator'),
            'https://downloads.wordpress.org/plugin/insert-headers-and-footers.zip',
            'https://wordpress.org/plugins/insert-headers-and-footers/'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Search & Replace Everything', 'duplicator'),
            'search-replace-wpcode/wsrw.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-search-and-replace.png',
            __('Efficiently manage your website’s content directly from the WordPress admin with Search & Replace Everything by WPCode. ' .
            'This tool is essential for site migrations, content updates, or any situation where batch text and image replacements are needed.', 'duplicator'),
            'https://downloads.wordpress.org/plugin/search-replace-wpcode.zip',
            'https://wordpress.org/plugins/search-replace-wpcode/'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Uncanny Automator', 'duplicator'),
            'uncanny-automator/uncanny-automator.php',
            DUPLICATOR_PLUGIN_URL . 'assets/img/about/plugin-uncanny-automator.png',
            __('Uncanny Automator is the easiest and most powerful way to automate your WordPress site with no code. ' .
            'Build automations in minutes that connect your WordPress plugins, sites and apps together using billions of recipe combinations.', 'duplicator'),
            'https://downloads.wordpress.org/plugin/uncanny-automator.zip',
            'https://wordpress.org/plugins/uncanny-automator/'
        );

        $result[$item->getSlug()] = $item;

        $item = new ExtraItem(
            __('Database Reset Pro', 'duplicator'),
            'db-reset-pro/db-reset-pro.php',
            DUPLICATOR_PLUGIN_URL . 'assets/css/images/db-reset-icon.png',
            __(
                'Database Reset Pro is the safest and simplest way to reset your WordPress database to its default state. 
            Unlike reinstalling WordPress, this database reset plugin preserves your files, uploads, 
            and admin credentials while giving you a fresh start in seconds.',
                'duplicator'
            ),
            'https://downloads.wordpress.org/plugin/db-reset-pro.zip',
            'https://wordpress.org/plugins/db-reset-pro/'
        );

        $result[$item->getSlug()] = $item;

        return $result;
    }
}
