# -*- coding:utf-8 -*-
# Copyright (c) 2020 Huawei Technologies Co.,Ltd.
#
# openGauss is licensed under Mulan PSL v2.
# You can use this software according to the terms
# and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
#          http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
# ----------------------------------------------------------------------------

import os
import sys
from gspylib.common.Common import DefaultValue
from base_utils.os.env_util import EnvUtil
from base_utils.os.file_util import FileUtil



class CheckperfImpl():
    """
    Class: check perf impl
    """

    def __init__(self):
        """
        function: constructor
        """
        pass

    def CheckPMKPerf(self, outputInfo):
        """
        function: check pmk perf
        """
        pass

    def CheckSSDPerf(self, outputInfo):
        """
        function: check ssd perf
        input  : outputInfo
        output : NA
        """
        pass

    def run(self):
        """
        function: the real interface that execute the check method
        input : NA
        output: NA
        """
        try:
            outputInfo = None
            # check output file
            if self.opts.outFile != "":
                self.opts.outFile_tmp = os.path.join(
                    EnvUtil.getTmpDirFromEnv(self.opts.user),
                    (os.path.split(self.opts.outFile)[1]
                     + "_tmp_%s" % os.getpid()))
                outputInfo = self.setOutFile()
            else:
                outputInfo = sys.stdout
            # check check item
            for key in self.opts.checkItem:
                if key == "PMK":
                    # check PMK
                    self.CheckPMKPerf(outputInfo)
                elif key == "SSD":
                    # check SSD
                    self.CheckSSDPerf(outputInfo)

            # Follow-up
            self.closeFile(outputInfo)
        except Exception as e:
            # close file handle if outputInfo is out file
            if self.opts.outFile and outputInfo:
                outputInfo.flush()
                outputInfo.close()
            if os.path.isfile(self.opts.outFile_tmp):
                FileUtil.removeFile(self.opts.outFile_tmp)
            # modify the log file's owner
            FileUtil.changeOwner(self.opts.user, self.logger.logFile)
            self.logger.error(str(e))
            sys.exit(1)

    def setOutFile(self):
        """
        function: set out file
        input  : NA
        output : NA
        """
        # get directory component of a pathname
        dirName = os.path.dirname(self.opts.outFile)
        # judge if directory
        if not os.path.isdir(dirName):
            FileUtil.createDirectory(dirName, True,
                                   DefaultValue.KEY_DIRECTORY_MODE)
        # create output file and modify permission
        FileUtil.createFile(self.opts.outFile, True, DefaultValue.KEY_FILE_MODE)
        FileUtil.changeOwner(self.opts.user, self.opts.outFile)
        self.logger.log(
            "Performing performance check. "
            "Output the checking result to the file %s." % self.opts.outFile)
        # write file
        self.opts.outFile_tmp = os.path.join(
            EnvUtil.getTmpDirFromEnv(self.opts.user),
            (os.path.split(self.opts.outFile)[1] + "_tmp_%s" % os.getpid()))
        if not os.path.isfile(self.opts.outFile_tmp):
            FileUtil.createFile(self.opts.outFile_tmp, True,
                              DefaultValue.KEY_FILE_MODE)
        FileUtil.changeOwner(self.opts.user, self.opts.outFile_tmp)
        fp = open(self.opts.outFile_tmp, "w")
        outputInfo = fp
        return outputInfo

    def closeFile(self, fp):
        """
        function: close file
        input  : fp
        output : NA
        """
        if self.opts.outFile and fp:
            # close file handle if outputInfo is out file
            fp.flush()
            fp.close()
            FileUtil.moveFile(self.opts.outFile_tmp, self.opts.outFile)
            self.logger.log("Performance check is completed.")
