#!/usr/bin/env python

#### Script to inactivate all the rnd plugin entries from db->rdx_plugin table and delete from filesystem ####
#### Be cautious when you run the script, this will delete the rnd plugins from db and fileSystem ####

import os
import subprocess
import argparse
from sys import argv
import shutil

## Define help
parser = argparse.ArgumentParser(
    description=''' This script is used to set rndPlugins to inactive. Need to run from backend.''')

parser.add_argument('mode', type=str, help='AssayDev/AD or Dx')
args = parser.parse_args()
db=""
schema=""
usr = "postgres"

# Setup and update db
def setConfig(mode):
    global db
    global schema
    if mode.lower()=="dx":
       db = "dx"
       schema = "dx_grdb"
    elif not mode or mode.lower()=="ad" or mode.lower()=="assaydev" or mode=="":
       db = "postgres"
       schema = "assaydev_grdb"

def updateDB():
    print ("BEFORE: DB UPDATE")
    sqlQuery1 = "sudo -u {0} psql -d {1} -c 'select id, name, version, state from {2}.rdx_plugin;'".format(usr,db,schema)
    for line in run_command(sqlQuery1):
        print(line.decode())

    print ("AFTER: DB UPDATE")
    sqlQuery2 = 'sudo -u {0} psql -d {1} -c "DELETE FROM {2}.rdx_plugin WHERE name in (SELECT name FROM  {2}.rdx_plugin pl WHERE NOT EXISTS (SELECT 1 FROM {2}.rdx_exp_plugin_executions ple WHERE pl.ID = ple.plugin_id) AND pl.name NOT in (\'IonReporterUploader\', \'coverageAnalysis\', \'molecularCoverageAnalysis\',\'CustomerSupportArchive\',\'sampleID\', \'SARS_CoV_2_annotateSnpEff\', \'generateConsensus\', \'SARS_CoV_2_controlStat\', \'SARS_CoV_2_lineageID\'));"'.format(usr,db,schema)
    
    sqlQuery3 = 'sudo -u {0} psql -d {1} -c "UPDATE {2}.rdx_plugin SET state=\'INACTIVE\' WHERE name in (SELECT name FROM  {2}.rdx_plugin pl WHERE EXISTS (SELECT 1 FROM {2}.rdx_exp_plugin_executions ple WHERE pl.ID = ple.plugin_id) AND pl.name NOT in (\'IonReporterUploader\', \'coverageAnalysis\', \'molecularCoverageAnalysis\',\'CustomerSupportArchive\',\'sampleID\', \'SARS_CoV_2_annotateSnpEff\', \'generateConsensus\', \'SARS_CoV_2_controlStat\', \'SARS_CoV_2_lineageID\'));"'.format(usr,db,schema)
    for query in [sqlQuery2, sqlQuery3, sqlQuery1]:
        for line in run_command(query):
            print (line.decode())

def run_command(command):
    p = subprocess.Popen(command,
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    return iter(p.stdout.readline, b'')


###Deletes all the rndPlugins excluding customerFacing plugins ########
def delete_from_file_system():
    sqlQuery1 = 'sudo -u {0} psql -d {1} -c "SELECT name FROM {2}.rdx_plugin WHERE name in (SELECT name FROM  {2}.rdx_plugin pl WHERE NOT EXISTS (SELECT 1 FROM {2}.rdx_exp_plugin_executions ple WHERE pl.ID = ple.plugin_id) AND pl.name NOT in (\'IonReporterUploader\', \'coverageAnalysis\', \'molecularCoverageAnalysis\',\'CustomerSupportArchive\',\'sampleID\', \'SARS_CoV_2_annotateSnpEff\', \'generateConsensus\', \'SARS_CoV_2_controlStat\', \'SARS_CoV_2_lineageID\'));"'.format(usr,db,schema)
    
    filteredPluginData = []
    for line in run_command(sqlQuery1):
        selectData=str(line.decode())
        filteredPluginData.extend(selectData.split())
    
    path = os.path.join(("/servershare/dxshare" if "dx" == mode else "/servershare/AssayDevshare"), "apps/IR/apps")
    for pluginDir in os.listdir(path):
        pluginDirTrim = pluginDir.rsplit('_', 1)[0]
        if pluginDirTrim in filteredPluginData:
            try:
                shutil.rmtree(os.path.join(path,pluginDir))
                print ("Deleted the Plugin folder %s" % pluginDirTrim)
            except OSError as e:
                print("Error: %s : %s" % (path, e.strerror))

if __name__ == '__main__':
    mode = argv[1]
    setConfig(mode)
    delete_from_file_system()
    updateDB()
