var isLaunchButtonsDebug = document.location.host.startsWith('cms-') || document.location.host.startsWith('v3-test-');

var launcherConfig = {}
function setupLauncher(ppid, fv, relaunchId) {
    launcherConfig.ppid = ppid;
    launcherConfig.fv = fv;
    launcherConfig.relaunchId = relaunchId;
}

setupLauncher('','','2.9.2,2.18.1,3.4.0');

function loadJS(onLoad) {
    if (!document.getElementById('som-js')) {
        let searchParams = new URL(document.location).searchParams;
        let installed = searchParams.get("installed");
        let src = 'https://screenpal.com/api/som.js?androidEnabled=true&iosEnabled=true&chromeAppId=ofhomjgaaamjpmjogmkglfojkdlabekg&brand=screenpal';
        if (installed) {
            src += '&installed=' + encodeURIComponent(installed);
        }
        let somJsScript = document.createElement('script');
        somJsScript.id = 'som-js';
        somJsScript.src = src;
        document.getElementsByTagName('body')[0].appendChild(somJsScript);
        somJsScript.addEventListener('load', function() {
            let checkOpentip = function() {
                setTimeout(function() {
                    if (window.Opentip) {
                        onLoad();
                        return;
                    }
                    checkOpentip();
                },200);
            }
            checkOpentip();
        }, false);
        return;
    }

    onLoad();
}

/***** Starting recorder and opening the editor *****/
function getFV(useVersion) {
  if (!useVersion) {
    useVersion = '';
  }

  // If they are requesting version then we'll use it unless this is old mac...
  let b = navigator.userAgent.toLowerCase();

  if (b.indexOf("mac os x 10_7") > 0 || b.indexOf("mac os x 10.7") > 0) {
    return 'MAC-10.7';
  }

  if (b.indexOf("mac os x 10_8") > 0 || b.indexOf("mac os x 10.8") > 0) {
    return 'MAC-10.8';
  }

  return useVersion;
}

// Split n times where the last array element is all the rest (like java string split).
function splitStringWithRemainder(string,separator,n) {
    let split = string.split(separator);
    if (split.length <= n)
        return split;
    let out = split.slice(0,n-1);
    out.push(split.slice(n-1).join(separator));
    return out;
}

function updateParamsWithCommand(params, command) {
  if (command === 'manager') {
    params.options.sm = "true";
  }
  else if (command === 'screenshot') {
    params.options.runCommand = "takeScreenshotAskIfReady";
  }
  else if (command === 'recorder') {
    // Recorder is default so nothing to set in runCommand
  }
  else if (command.indexOf("editHostedId-") === 0) {
    params.options.editHostedId = command.substr("editHostedId-".length);
  }
  else if (command.indexOf("workflow-") === 0) {
    let args = splitStringWithRemainder(command,'-',3);
    params.options.workflowName = args[1];
    if (args.length>2)
        params.options.workflowUrl = args[2];
  }
  else {
    params.options.runCommand = command;
  }

  return params;
}

function launchRecorder(analyticsName) {
  launchApp(analyticsName, 'recorder');
}

function launchManager(analyticsName) {
  launchApp(analyticsName, 'manager');
}

function launchScreenshot(analyticsName) {
  launchApp(analyticsName, 'screenshot');
}

function launchEditHosted(analyticsName, videoId) {
  launchApp(analyticsName, 'editHostedId-'+videoId);
}

function launchApp(analyticsName, runcommand) {
  loadJS(function(){
    let params = {
      id: 'som-' + (getCookie("session") || "0"),
      type: 'bottom-bar',
      options:{"fv": getFV(launcherConfig.fv) }
    };

    let eventName = 'Mkg' + 'ButtonClick';
    let eventProps = {
      action: 'click',
      name: analyticsName
    };

    if (runcommand) {
      params = updateParamsWithCommand(params, runcommand);
    }
    if (launcherConfig.ppid) {
      params.options.pp = launcherConfig.ppid;
    }
    if (launcherConfig.relaunchId) {
      params.options.relaunchId = launcherConfig.relaunchId;
    }
    SOM.Recorder(params).start();

    logLaunchButtonsDebug('Analytics for "' + eventName + '" would fire for: "' + analyticsName + '"');

    // Only fire if we're on a host where this is defined (ie won't be setup on CMS).
    if (typeof analyticsEvent === "function") {
        analyticsEvent(eventName, eventProps, null);
    }
  });
}

function setupLaunchLink(type, link) {
    let analyticsName = 'Launch'+(type.charAt(0).toUpperCase()+type.slice(1));
    if (link.innerText !== '')
        analyticsName = link.innerText;

    logLaunchButtonsDebug('Found launch button for type "' + type + '" with analyticsName "' + analyticsName + '"');

    link.addEventListener('click',(event)=>{
        event.preventDefault();
        launchApp(analyticsName,type);
    });
}

function setupLaunchWorkflowLink(link) {
    let workflowName = getWorkflowNameFromElementOrParents(link);

    let analyticsName = 'LaunchWorkflow'+(workflowName.charAt(0).toUpperCase()+workflowName.slice(1));
    if (link.innerText !== '')
        analyticsName = link.innerText;

    let command = 'workflow-' + workflowName;

    let url = 'NONE';
    if (link.href !== '' && !link.href.endsWith('#') && !link.href.startsWith('#') && link.href !== 'https://themify.me/') {
        url = link.href;
        command += '-' + url;
    }

    logLaunchButtonsDebug('Found launch button for workflow "' + workflowName + '" with analyticsName "' + analyticsName + '" and url="' + url + '"');

    link.addEventListener('click',(event)=>{
        event.preventDefault();
        launchApp(analyticsName, command);
    });
}

function getWorkflowNameFromElementOrParents(e) {
    let checkLinkClasses = Array.from(e.classList).filter(c => c.includes('workflow-'));
    if (checkLinkClasses.length==1) {
        return checkLinkClasses[0].split('workflow-',2)[1];
    }

    return e.parentElement ? getWorkflowNameFromElementOrParents(e.parentElement) : undefined;
}

function queryType(q) {
    logLaunchButtonsDebug('Looking for launch buttons with query: "' + q + '"');
    return Array.from(document.querySelectorAll(q));
}

function queryLaunchButtons(type) {
    return [].concat(
        queryType('.cms-launch-button-'+type+' a'),
        queryType('a.launch-button-'+type)
    );
}

function queryLaunchWorkflowButtons() {
    return [].concat(
        queryType('[class*="cms-launch-button-workflow-"] a'),
        queryType('a[class*="launch-button-workflow-"]')
    );
}

function logLaunchButtonsDebug(s) {
    if (isLaunchButtonsDebug)
        console.log('logLaunchButtonsDebug -- ' + s);
}

function setupLaunchButtons() {
    let launchTypes = ['recorder','manager','screenshot'];

    for (let type of launchTypes) {
        for (let link of queryLaunchButtons(type)) {
            setupLaunchLink(type, link);
        }
    }

    for (let link of queryLaunchWorkflowButtons()) {
        setupLaunchWorkflowLink(link);
    }
}

if (document.readyState === "loading")
    document.addEventListener('DOMContentLoaded', setupLaunchButtons);
else
    setupLaunchButtons();
