<?php
/**
 * @author 1902 Software
 * @copyright Copyright © 2023 1902 Software (https://1902software.com/magento/)
 * @package WriteTextAI_WriteTextAI
 */

namespace WriteTextAI\WriteTextAI\ViewModel;

use WriteTextAI\WriteTextAI\Model\SettingManager;
use WriteTextAI\WriteTextAI\Helper\Data;
use WriteTextAI\WriteTextAI\ViewModel\Settings;

class TooltipCategory implements \Magento\Framework\View\Element\Block\ArgumentInterface
{
    public const FAQ_URL = 'https://writetext.ai/frequently-asked-questions#credit-cost';

    public const KEYWORDS_GUIDE_URL = 'https://writetext.ai/guide-mastering-keyword-optimization';

    /**
     * @var SettingManager
     */
    protected $settingManager;

    /**
     * @var Data
     */
    protected $helper;

    /**
     * @var Settings
     */
    protected $settings;

    /**
     * Constructor
     *
     * @param SettingManager $settingManager
     * @param Data $helper
     * @param Settings $settings
     */
    public function __construct(
        SettingManager $settingManager,
        Data $helper,
        Settings $settings
    ) {
        $this->settingManager = $settingManager;
        $this->helper = $helper;
        $this->settings = $settings;
    }

    /**
     * Get tooltip
     *
     * @param string $block
     * @return string
     */
    public function getTooltipCategory($block)
    {
        $tooltip = '';
        switch ($block) {
            case 'wtai.reviewed.category':
                $tooltip = $this->getReviewedTooltipCategory();
                break;
            case 'wtai.keywords.category':
                $tooltip = $this->getKeywordsTooltipCategory();
                break;
            case 'wtai.generate.rewrite.category':
                $tooltip = $this->getGenerateRewriteTooltipCategory();
                break;
            case 'wtai.audience.category':
                $tooltip = $this->getAudienceTooltipCategory();
                break;
            case 'wtai.category.description':
                $tooltip = $this->getCategoryDescriptionTooltip();
                break;
            case 'wtai.category.image':
                $tooltip = $this->getCategoryImageTooltip();
                break;
            case 'wtai.page.title.category':
                $tooltip = $this->getPageTitleTooltipCategory();
                break;
            case 'wtai.page.description.category':
                $tooltip = $this->getPageDescriptionTooltipCategory();
                break;
            case 'wtai.transfer.category':
                $tooltip = $this->getTransferTooltipCategory();
                break;
            case 'wtai.category.intent':
                $tooltip = $this->getCategoryIntentTooltip();
                break;
            case 'wtai.add.keywords.category':
                $tooltip = $this->getAddKeywordsTooltip();
                break;
            case 'wtai.ai.model.category':
                $tooltip = $this->getCategoryAiModelTooltip();
                break;
            case 'wtai.no.ai.model.category':
                $tooltip = $this->getNoAiModelAssignedTooltip();
                break;
            case 'wtai.additional.prompt.category':
                $tooltip = $this->getAdditionalPromptTooltip();
                break;
            case 'wtai.special.instructions.category':
                $tooltip = $this->getSpecialInstructionsTooltipCategory();
                break;
        }

        return $tooltip;
    }

    /**
     * Get add keywords tooltip
     *
     * @return string
     */
    public function getAddKeywordsTooltip()
    {
        return sprintf('<p>%s</p>', __('(Optional) In the Starter plan, you can manually add'
            . ' target keywords to guide content generation.'))
            . sprintf('<p>%s</p>', __('In the Pro plan, this field is used to enter optional seed keywords that'
                . ' help kickstart AI-powered keyword analysis. These keywords serve as starting points'
                . ' for identifying high-potential terms, but may not always be included in the final pipeline.'
                . ' If you don’t enter any, WriteText.ai will automatically generate seed keywords based'
                . ' on your category name, product names within the category (up to 100, randomly selected),'
                . ' and image analysis. Pro users'
                . ' can also create custom pipelines after analysis to directly target specific keywords they want'
                . ' to optimize for.'));
    }

    /**
     * Get representative products tooltip
     *
     * @return string
     */
    public function getRepresentativesTooltip()
    {
        $rules = $this->getRules();
        $maxRepresentativeProducts = $rules['maxRepresentativeProducts'] ?? '';

        $tooltip = '<p>' . sprintf(
            __(' AI-powered online research on the %s representative products to improve writing accuracy.'),
            $maxRepresentativeProducts
        );
        return $tooltip;
    }

    /**
     * Get meta title tooltip for category
     *
     * @return string
     */
    public function getPageTitleTooltipCategory()
    {
        $pageTitleLength = $this->helper->getMaxLengthSettings('page_title');

        return sprintf(__('<p>WriteText.ai aims to generate a title with around'
            . ' %s characters, based on current SEO best practices. The current'
            . ' meta title saved for the category is displayed in the box on'
            . ' the right for your reference only.</p>'), $pageTitleLength)
            . sprintf("<p>%s</p>", __('To customize how titles are structured or written,'
            . ' you can set up a template for meta titles in the backend under Templates.'
            . ' If you have not set up or assigned any templates, WriteText.ai will'
            . ' generate a title based on its default approach using your category data'));
    }

    /**
     * Get meta description tooltip for category
     *
     * @return string
     */
    public function getPageDescriptionTooltipCategory()
    {
        $maxPageDescriptionLength = $this->helper->getMaxLengthSettings('page_description');

        return sprintf(__('<p>WriteText.ai aims to generate a description with'
            . ' around %s characters, based on current SEO best practices. The current'
            . ' meta description saved for the category is displayed in the box on'
            . ' the right for your reference only.</p>'), $maxPageDescriptionLength);
    }

    /**
     * Get generate rewrite tooltip category
     *
     * @return string
     */
    public function getGenerateRewriteTooltipCategory()
    {
        return sprintf('<p class="wtai-heading">%s</p>', __('Generate new text'))
            . sprintf('<p>%s</p>', __('Generate text for your selected text types based on'
                . ' the settings on this page.'));
    }

    /**
     * Get transfer tooltip for Category
     *
     * @return string
     */
    public function getTransferTooltipCategory()
    {
        return sprintf("<p>%s</p>", __("When you're done generating and/or editing text,"
                . " you have the option to save the draft inside WriteText.ai or transfer"
                . " the text to Magento. Transferring your category text to Magento will publish "
                . "it live on the website. If the updates did not reflect in your page, you may"
                . " need to flush the cache or run reindexing. Please also make sure that your "
                . "category is enabled in the frontend."))
            . sprintf("<p>%s</p>", __("Note: Any media or directive you have inserted in"
                . " your current Magento text will be overwritten when you transfer from WriteText.ai."));
    }

    /**
     * Get reviewed tooltip for category
     *
     * @return string
     */
    public function getReviewedTooltipCategory()
    {
        return sprintf('<p>%s</p>', __('Check this box to keep track of the categories'
                . ' where you have reviewed the text. This is especially helpful if you'
                . ' have an internal workflow where text needs to go through a review'
                . ' process first before being published on the website. This checkbox'
                . ' does not affect the live content, it is only a classification.'))
            . sprintf('<p>%s</p>', __('You can filter reviewed categories by'
                . ' selecting “Reviewed” under the “Filter by WriteText.ai status”'
                . ' dropdown in the category list.'));
    }

    /**
     * Get audience tooltip for category
     *
     * @return string
     */
    public function getAudienceTooltipCategory()
    {
        return __(
            '<p>Select one or more tones to set the overall mood'
            . ' and attitude of the text, and then choose a style to'
            . ' set the voice and structure of the text.</p>'
            .'<p>Select the applicable audience for your product so WriteText.ai'
            . ' can generate text that will appeal to them. If you don’t select an audience, '
            . 'the generated text will default to a “neutral” audience. WriteText.ai also'
            . ' suggests more specific target markets based on your keywords. Click on the'
            . ' audience to select it or type in your own custom audience in the box.</p>'
            . '<p>If you want more precise control based on your own brand guidelines or existing content, '
            . 'you can build a brand voice instead.</p>'
        );
    }

    /**
     * Get keywords tooltip
     *
     * @return string
     */
    public function getKeywordsTooltipCategory()
    {
        return sprintf("<p><strong>%s</strong></p>", __('Target keywords'))
            . sprintf("<p>%s</p>", __('Target keywords allow you to guide the AI toward optimizing'
                . ' your content for specific search terms. How you can use them depends on your plan.'))
            . sprintf("<p><strong>%s</strong></p>", __('Starter Plan'))
            . sprintf("<p>%s</p>", __('In the Starter plan, you can manually add target keywords'
                . ' before generating content. This is ideal if you already know which keywords'
                . ' you want to focus on. However, the full keyword optimization pipeline—including'
                . ' keyword analysis, ranking insights, clustering, and automation—is only available in the Pro plan.'))
            . sprintf("<p><strong>%s</strong></p>", __('Pro Plan'))
            . sprintf("<p>%s", __('Pro unlocks the full keyword optimization pipeline'))
            . sprintf(" (<a href='%s' target='_blank'>%s</a>): ", self::KEYWORDS_GUIDE_URL, __(
                'read the complete guide here'
            ))
            . sprintf("%s</p>", __('an AI-powered keyword analysis tool that uses the keyword ladder'
                . ' strategy to help you gradually improve your category page rankings.'))
            . sprintf("<p>%s</p>", __('Before starting, you can optionally add seed keywords—these'
                . ' help guide the AI during analysis, but aren’t guaranteed to'
                . ' be used if they don’t match the category context.'))
            . sprintf("<p>%s</p>", __('Once you click "Start AI-powered keyword analysis", the system will:'))
            . sprintf("<p><ul><li class='wtai-list-disc'>%s</li>", __(
                'Discover keywords your category pages already rank for'
            ))
            . sprintf("<li class='wtai-list-disc'>%s</li>", __(
                'Suggest new keyword ideas using category data, image analysis, and online research'
            ))
            . sprintf("<li class='wtai-list-disc'>%s</li>", __('Automatically organize keyword suggestions'
                . ' into cluster-based pipelines, starting with low-difficulty terms'
                . ' and progressing to higher-volume, more competitive ones'))
            . sprintf("<li class='wtai-list-disc'>%s</li>", __(
                'Allow you to create your own custom pipelines to set specific keywords and stages for targeting'
            ))
            . sprintf("<li class='wtai-list-disc'>%s</li></ul></p>", __(
                'Provide keyword insights such as search volume, competition level, and search intent'
            ))
            . sprintf("<p>%s</p>", __(
                'You can continue to manually add target keywords as needed to further refine the AI’s output.'
            ))
            . sprintf("<p>%s</p>", __('Due to the complex nature of this process, starting AI-powered keyword analysis'
                . ' may take some time. You can click on "Automatically generate text when keyword analysis is done"'
                . ' to streamline the process. Make sure to select the text types you want to'
                . ' generate before starting AI-powered keyword analysis.'))
            . sprintf("<p><b>%s</b></p>", __('How the keyword optimization pipeline works'))
            . sprintf("<p>%s</p>", __('<em>Starting with low-difficulty keywords:</em><br>'
                . 'The pipeline identifies keywords with lower competition but good search potential.'))
            . sprintf("<p>%s</p>", __('<em>Progressive optimization:</em><br>As your category page starts to'
                . ' rank for low-difficulty keywords, the pipeline gradually recommends'
                . ' optimizing for higher-difficulty keywords.'))
            . sprintf("<p>%s</p>", __('<em>Automation and notifications:</em><br>WriteText.ai'
                . ' automates much of this process, analyzing keyword trends and notifying you when'
                . ' pages are ready for the next optimization step. Depending on your preferences,'
                . ' it can fully automate regenerating text with updated keywords and transferring to Magento,'
                . ' just regenerate and notify you for review, or prompt you to'
                . ' check and initiate regenerating text yourself.'))
            . sprintf("<p>%s</p>", __('<em>Iterative content refinement:</em><br>At every stage,'
                . ' the pipeline ensures your content is updated and optimized for current keyword trends,'
                . ' helping you maintain relevance and visibility.'));
    }

    /**
     * Get category description tooltip
     *
     * @return string
     */
    public function getCategoryDescriptionTooltip()
    {
        return __('<p>The current category description saved for the category is displayed'
                . ' in the box on the right for your reference only.</p>')
            . __('<p>Target length<br/>')
            . __('Indicate your target length by setting a minimum and maximum word'
                . ' count. WriteText.ai will aim to generate text within the number'
                . ' you set, but it may give you more or less words than expected from'
                . ' time to time. Note that your credit cost will depend on the target'
                . ' length you set so make sure to set a reasonable target range. This'
                . " target length is only considered when you don't have a template selected.</p>")
            . __('<p>Templates<br/>')
            . __('To better customize how descriptions are structured or written, you'
                . ' can set up a template for category descriptions in the backend'
                . ' under Templates. If you haven’t set or assigned a template, WriteText.ai'
                . ' will generate the text based on its default approach using your category'
                . ' data and the target length you define. When a template is used, the'
                . ' target length setting is ignored and content is generated based on'
                . ' the structure of the template. An estimated credit cost is shown in'
                . ' the preview panel based on the content sections included.');
    }

    /**
     * Get category image tooltip
     *
     * @return string
     */
    public function getCategoryImageTooltip()
    {
        return __('<p>Your primary image as additional context.</p>');
    }

    /**
     * Get intent tooltip
     *
     * @return string
     */
    public function getCategoryIntentTooltip()
    {
        return __("Search intent refers to the purpose behind a user's search"
            . " query—what they’re looking to achieve. By default, commercial"
            . " intent is selected as recommended for category pages.");
    }
    /**
     * Get intent tooltip
     *
     * @return string
     */
    public function getCategoryIntentTooltipDisabled()
    {
        return __("Search intent refers to the purpose behind a user's search"
            . " query—what they’re looking to achieve. By default, commercial"
            . " intent is selected as recommended for category pages.");
    }

    /**
     * Get no AI model assigned tooltip
     *
     * @return string
     */
    public function getNoAiModelAssignedTooltip()
    {
        return sprintf(
            '<p>%s<br/>%s</p>'
            . '<p class="wtai-go-linked-webshops">'
            . '<a href="%s" target="_blank" class="action-primary primary">%s</a>'
            . '</p>',
            __('No brand voice is assigned to this webshop.'),
            __(
                'You can assign an existing brand voice or build a new one in the backend, '
                . 'then link it to this webshop to use it here.'
            ),
            'https://platform.writetext.ai/webshops',
            __('Assign brand voice in backend')
        );
    }

    /**
     * Get no AI model selected tooltip
     *
     * @return string
     */
    public function getCategoryAiModelTooltip()
    {
        return __('Brand voice tooltip category');
    }

    /**
     * Get additional prompt tooltip
     *
     * @return \Magento\Framework\Phrase
     */
    public function getAdditionalPromptTooltip()
    {
        return __(
            'Enter any additional instructions for the AI to follow when generating text. '
            . 'These instructions will be added to the prompt that the AI uses to generate text.'
        );
    }

    /**
     * Get special instructions tooltip
     *
     * @return \Magento\Framework\Phrase
     */
    public function getSpecialInstructionsTooltipCategory()
    {
        return __('Enter other details or instructions that you would like WriteText.ai'
            . ' to consider in generating text for the categories you selected'
            . ' (e.g., add information on discounts, special sales, etc).'
            . ' Special instructions will be cleared at the end of a user session.');
    }
}
