#!c:\Program Files\Python39\python.exe
# -*- coding: UTF-8 -*-

'''
$RCSfile: system.py,v $
$Revision$
$Author: markus $
$Date$
The BioCASE querytool
'''

import os
# ***** include the biocase.lib directory in the python sys path for importing *****
exec(open(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir, 'lib', 'biocase', 'adjustpath.py'))).read())
exec(open(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir, 'lib', 'biocase', 'appinit.py'))).read())

from biocase.configtool.general import *
from biocase.tools.caching   import clearCache
import biocase.datasources
from biocase.cmfinfo import CMFTemplateListClass
import shutil


def replNone(x, replace_string=''):
    if x is None:
        return replace_string
    else:
        return x
        
############################################################################################################
#
#   MAIN
#
#===========================================================================================================

# check authentication!
authorize(form, dsa=None)

#
# PROCESS FORMS
#
if action == 'dsa_create':
    # create a new DSA
    newdsa = form.getfirst('dsa_name_new', None)
    if newdsa is not None:
        biocase.datasources.createDsa(newdsa, form.getfirst('dsa_template_new', None))

elif action == 'dsa_delete':
    # delete a DSA
    dsaDir = os.path.join(cfg.dsaLocator, form.getfirst('del_dsa', None))        
    if os.path.isdir(dsaDir):
        recycleBinDir = str(cfg.dsaLocator + ".recycle.bin")
        if not os.path.exists(recycleBinDir):
            os.makedirs(recycleBinDir)
        dsaRecycleBinDir = os.path.join(recycleBinDir, form.getfirst('del_dsa', None))        
        # Check if dsa already exists in recycle bin
        if os.path.exists(dsaRecycleBinDir):
        	shutil.rmtree(dsaRecycleBinDir, False)
        shutil.move(dsaDir, dsaRecycleBinDir)
        log.info("Datasource %s is moved to recycle bin."%dsa)
        
        try:
            del_dsa = form.getfirst('del_dsa', None)
            archivePath = os.path.join(cfg.archiveWorkLocator, del_dsa)
            dldPath = os.path.join(cfg.archiveDownloadLocator, del_dsa)
            shutil.rmtree(archivePath)
            shutil.rmtree(dldPath)
        except:
            log.error("Can't delete archive folders " + archivePath + " and " + dldPath + ". Please removit manually")

    else:
        log.error("Can't delete datasource %s. Please remove it manually."%dsa)

elif action == 'dsa_restore':
    dsaSource = dsaRecycleBinDir = os.path.join(str(cfg.dsaLocator) + ".recycle.bin", form.getfirst('restore_dsa', None))
    dsaTarget = os.path.join(cfg.dsaLocator, form.getfirst('restore_dsa', None))     
    if os.path.isdir(dsaSource):
        shutil.move(dsaSource, dsaTarget)
        log.info("Datasource %s is restored."%dsa)

elif action == 'empty_recyclebin':
    dsaRecycleBinDir = str(cfg.dsaLocator) + ".recycle.bin"
    if os.path.exists(dsaRecycleBinDir):
        for dsa in os.listdir(dsaRecycleBinDir):
            shutil.rmtree(os.path.join(dsaRecycleBinDir, dsa), False)
            log.info("Datasource %s is recycled."%dsa)
    
elif action == 'cfg_update':
    for opt in cfg._listOptions("server"):
        if form.getfirst("server."+opt) is not None:
            if opt == 'graphviz_dot':
                cfg.server.__setOption__(opt, form.getfirst("server."+opt).replace("\\", "/"))
            else:
                cfg.server.__setOption__(opt, form.getfirst("server."+opt))
    cfg.__save__()
elif action == 'clear_cache':
    clearCache()


#
# CREATE OUTPUT VIA TEMPLATE
#

# load html template
tmpl = PageMacro('Content', PageMacro.DELMODE)
tmpl.load('Content', os.path.join(templateDir, '_system.html'))

# server config
for opt in cfg._listOptions("server"):
    tmpl["server."+opt] = str(getattr(cfg.server, str(opt)))

# DATASOURCES
dsaObjList  = biocase.datasources.getDsaList()
dsaTmplList = [{'dsa':dsaObj.name} for dsaObj in dsaObjList]
tmpl.expand('Content', 'datasourcelist', dsaTmplList)

# Recycle Bin
dsaObjList  = biocase.datasources.getDsaInRecycleBinList()
if len(dsaObjList) == 0:
    tmpl["emptyButton"] = "disabled"
dsaTmplList = [{'dsa':dsaObj.name} for dsaObj in dsaObjList]
tmpl.expand('Content', 'recyclebin', dsaTmplList)

# DSA TEMPLATES
tmpl['dsa_template_options']=getDropDownOptionHtml([t for t in os.listdir(cfg.dsaTemplateLocator) if not t.startswith('.')],'empty')

# Logfiles
links = ['<a href="fileviewer.cgi?filename=%s" target="_blank">%s</a>' % (fname, fname) for fname in os.listdir(cfg.logLocator) if fname != 'dummy.txt']
tmpl['view_logs'] = '<br>'.join(links)

# CMF TEMPLATES
cmfTmplListObj = CMFTemplateListClass()
cmfTmplList = [{'name':cmf.name, 'ns':cmf.NS, 'concept_num':str(cmf.concepts)} for cmf in cmfTmplListObj]
tmpl.expand('Content', 'cmftemplates', cmfTmplList)

# ALL CFGs
tmpl['cfgprintout'] = str(cfg).replace("\\", "\\\\")


#
# print HTML !
#
printOverHTTP( tmpl )