import { Button } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import useMenu from "../Menu/MenuData";
import useFields from "../Settings/FieldsData";
import useOnboardingData from "./OnboardingData";
import useProgress from "../Dashboard/Progress/ProgressData";
import useRiskData from "../Settings/RiskConfiguration/RiskData";
import useSslLabs from "../Dashboard/SslLabs/SslLabsData";

const OnboardingControls = ({isModal}) => {
    const { getProgressData} = useProgress();
    const { updateField, setChangedField, updateFieldsData, fetchFieldsData, saveFields} = useFields();
    const { setSelectedMainMenuItem, selectedSubMenuItem} = useMenu();
    const {
        fetchFirstRun, fetchVulnerabilities
    } = useRiskData();
    const {
        setSslScanStatus,
    } = useSslLabs();
    const {
        dismissModal,
        activateSSL,
        certificateValid,
        setFooterStatus,
        networkwide,
        processing,
        setProcessing,
        steps,
        currentStepIndex,
        currentStep,
        setCurrentStepIndex,
        overrideSSL,
        email,
        saveEmail,
        pluginInstaller,
    } = useOnboardingData();

    const goToDashboard = () => {
        if ( isModal ) {
           dismissModal(true);
        }
        setSelectedMainMenuItem('dashboard');
    }

    const saveAndContinue = async () => {
        let vulnerabilityDetectionEnabled = false;
        if (currentStep.id === 'features') {
            setCurrentStepIndex(currentStepIndex+1);
            setProcessing(true);
            //loop through all items of currentStep.items
            for (const item of currentStep.items){
                if ( item.id=== 'health_scan' && item.activated ) {
                    setFooterStatus(__("Starting SSL health scan...", "really-simple-ssl") );
                    setSslScanStatus('active');
                }

                if ( ! item.premium || ! item.activated ) {
                    for (const fieldId of Object.values(item.options)) {
                        updateField(fieldId, item.activated);
                        setChangedField(fieldId, item.activated);
                    }
                }

                if  ( item.id === 'vulnerability_detection' ) {
                    vulnerabilityDetectionEnabled = item.activated;
                }
            }
            setFooterStatus(__("Activating options...", "really-simple-ssl") );
            await saveFields(true, false);
            if (vulnerabilityDetectionEnabled) {
                setFooterStatus(__("Initializing vulnerability detection...", "really-simple-ssl") );
                await fetchFirstRun();
                setFooterStatus(__("Scanning for vulnerabilities...", "really-simple-ssl") );
                await fetchVulnerabilities();
            }

            setFooterStatus(__("Updating dashboard...", "really-simple-ssl") );
            await getProgressData();
            setFooterStatus( '' );
            setProcessing(false);
        }
        if ( currentStep.id === 'email' ) {
            await saveEmail();
            setCurrentStepIndex(currentStepIndex+1);
            updateField('send_notifications_email', true );
            updateField('notifications_email_address', email );
            updateFieldsData(selectedSubMenuItem);
        }

        if ( currentStep.id === 'plugins' ) {
            setCurrentStepIndex(currentStepIndex+1)
            for (const item of currentStep.items) {
                if (item.action !== 'none' && item.action !== null ) {
                    // Add the promise returned by pluginInstaller to the array
                    await pluginInstaller(item.id, item.action, item.title );
                }
            }
            setFooterStatus('')
        }

        if (currentStep.id === 'pro') {
            if (rsssl_settings.pro_plugin_active) {
                setProcessing(true);
                //loop through all items of currentStep.items
                for (const item of currentStep.items) {
                    if (item.activated) {
                        if (item.id === 'advanced_headers') {
                            for (const option of item.options) {
                                if (typeof option === 'string') {
                                    // Single option
                                    updateField(option, true);
                                    setChangedField(option, true);
                                } else if (Array.isArray(option)) {
                                    // [option -> value] pair
                                    const [fieldId, value] = option;
                                    updateField(fieldId, value);
                                    setChangedField(fieldId, value);
                                }
                            }
                        } else {
                            for (const fieldId of Object.values(item.options)) {
                                updateField(fieldId, true);
                                setChangedField(fieldId, true);
                            }
                        }
                    }
                }
                setFooterStatus(__("Activating options...", "really-simple-ssl"));
                await saveFields(true, false);

                setFooterStatus(__("Updating dashboard...", "really-simple-ssl"));
                await getProgressData();
                setFooterStatus('');
                setProcessing(false);
            }
            goToDashboard();
        }
    }

    const handleActivateSSL = async () => {
        await activateSSL();
        await getProgressData();
        await fetchFieldsData( );
    }

    const goToLetsEncrypt = () => {
        if (isModal) dismissModal(true);
        window.location.href=rsssl_settings.letsencrypt_url;
    }

    let ActivateSSLText = networkwide ? __("Activate SSL networkwide", "really-simple-ssl") : __("Activate SSL", "really-simple-ssl");
    if ( currentStepIndex === 0 ) {
        return (
            <>
                { isModal && !certificateValid && <Button onClick={() => {goToLetsEncrypt()}}>{__("Install SSL", "really-simple-ssl")}</Button>}
                <Button disabled={processing || (!certificateValid && !overrideSSL) } isPrimary onClick={() => {handleActivateSSL()}}>{ActivateSSLText}</Button>
            </>
        );
    }

    if (currentStepIndex>0 && currentStepIndex<steps.length-1) {
        return (
            <>
                <Button  onClick={() => {setCurrentStepIndex(currentStepIndex+1)}}>{__('Skip', 'really-simple-ssl')}</Button>
                <Button isPrimary onClick={() => saveAndContinue() }>
                    {currentStep.button}
                </Button>
            </>
        );
    }

    //for last step only
    if ( steps.length-1 === currentStepIndex ) {
        let upgradeText = rsssl_settings.is_bf ? __("Get 40% off", "really-simple-ssl") : __("Get Pro", "really-simple-ssl");
        return (
            <>
                <Button isPrimary onClick={() => saveAndContinue() }>{__('Finish', 'really-simple-ssl')}</Button>
                { !rsssl_settings.pro_plugin_active && <Button rel="noreferrer noopener" target="_blank" isPrimary href={rsssl_settings.upgrade_link} >{upgradeText}</Button>}
            </>
        );
    }
}

export default OnboardingControls;