#
#coding:utf-8
#
#Author  : QCSun
#Email   : qcsun@sunhpc.com
#Times   : 2023-04-14 05:21:02
#WebSite : https://www.sunhpc.com

import os
import re
import sys
import sunhpc
import shutil

class command(sunhpc.commands.soft.command):
    pass

class Command(command):
    """
    Compilation and installation of the parallel computing software.

    <arg type="string" name="version">
    Specifies the software version. e.g,, version=x.x.x
    </arg>

    <param type="path" name="source">
    Specifies the software source path. Default: /mnt/usb
    </param>

    <param type="path" name="prefix">
    Specifies the software install path. Default: /share/apps/soft
    </param>

    <param type="path" name="envs">
    Specifies the environment variable storage path. Default: /share/apps/envs
    </param>

    <example cmd='soft mpi prefix=/share/apps/soft/xxx version=x.x.x'>
    Build the command line and associated parameters for this software.
    </example>
    """
    def run(self, params, args):

        (prefix, source, envs, version) = self.fillParams([
            ('prefix', '/share/apps/soft'),
            ('source', '/mnt/usb'),
            ('envs', '/share/apps/envs'),
            ('version', None),
            ])

        softname = 'schrodinger'
        suffname = 'tar.gz'
        dirsname = os.path.join(source, 'hpcsoft', 'Schrodinger')
        verslist = self.getVersions(key=softname, suffix=suffname, dirs=dirsname)

        if len(args):
            version = args[0]

        if not version:
            self.msg('must supply an "Version Number", e.g,, version=%s' % '/'.join(verslist), 'a')

        self.create_dirs(prefix, source, envs, version, softname, suffname, dirsname)

        self.build(prefix)
        #self.clean()

    def build(self, prefix):
        """Start build the software."""
        self.cwd = os.getcwd()

        names = os.listdir(self.tmpdirs)
        if self.basename not in names:
            self.msg('Unpack the file from the %s to the %s directory.' % (self.filename, prefix))
            os.system('tar -xf %s -C %s' % (self.source, self.tmpdirs))

        cmd  = 'sh %s/INSTALL ' % self.distri_dirs
        cmd += '-s %s ' % self.prefix
        cmd += '-t %s/trirdparty ' % self.prefix
        cmd += '-k %s -m ' % self.scratch
        os.system(cmd)

        # copy patcher to self.prefix
        patcher_src = os.path.join(self.distri_dirs, 'patcher')
        patcher_dst = os.path.join(self.prefix, 'patcher')
        shutil.copyfile(patcher_src, patcher_dst)

        with open(self.envfile, 'w') as f:
            f.write('#!/bin/sh\n')
            f.write('#\n# %s env config\n#\n\n' % self.basename)
            f.write('export PATH=%s:%s/utilities:$PATH\n' % (self.prefix, self.prefix))
            f.write('export SCHRODINGER=%s\n' % (self.prefix))
            f.write('# export LD_LICENSE_FILE=27000@xxx.xxx.xxx\n\n')

        # create shared user and group.
        self.msg('')
        self.msg('--------------------------------------------------------')
        self.msg('Create a shared group to run the %s software.' % self.basename)
        self.msg('  1, groupadd -g 888    public ')
        self.msg('  2, usermod  -G public dell   ')
        self.msg('  3, chown    -R root:public %s' % self.prefix)
        self.msg('--------------------------------------------------------')
        self.msg('')
        self.msg('  source %s' % self.envfile)
        self.msg('--------------------------------------------------------')
        

    def create_dirs(self, prefix, source, envs, version, softname, suffname, dirsname):
        """Create base build directory."""

        self.basename = '%s-%s' % (softname, version)
        self.filename = '%s.%s' % (self.basename, suffname)

        self.prefix = os.path.join(prefix, softname, version)
        if not os.path.exists(self.prefix):
            os.makedirs(self.prefix)

        self.scratch = os.path.join(prefix, 'scratch', softname)
        if not os.path.exists(self.scratch):
            os.makedirs(self.scratch)
            os.chmod(self.scratch, 0o777)

        self.source = os.path.join(dirsname, self.filename)
        if not os.path.exists(self.source):
            self.msg('The %s does not exist,please check it.' % self.source, 'a')

        if not os.path.exists(envs):
            os.makedirs(envs)
        self.envfile = os.path.join(envs, '%s-%s' % (softname, version))

        self.tmpdirs = os.path.join(prefix, 'tmpdirs', softname)
        if not os.path.exists(self.tmpdirs):
            os.makedirs(self.tmpdirs)

        self.distri_dirs = os.path.join(self.tmpdirs, self.basename)

    def clean(self):
        """Clean the install tmp directory."""
        if os.path.exists(self.tmpdirs):
            shutil.rmtree(self.tmpdirs)



        



























