# Copyright (C) 2016 Intel Corporation
# Released under the MIT license (see COPYING.MIT)

import os
import subprocess

from oeqa.utils.buildproject import BuildProject

class SDKBuildProject(BuildProject):
    def __init__(self, testpath, sdkenv, uri, testlogdir, builddatetime,
            foldername=None, dl_dir=None):
        self.sdkenv = sdkenv
        self.testdir = testpath
        self.targetdir = testpath
        os.makedirs(testpath, exist_ok=True)
        self.datetime = builddatetime
        self.testlogdir = testlogdir
        os.makedirs(self.testlogdir, exist_ok=True)
        self.logfile = os.path.join(self.testlogdir, "sdk_target_log.%s" % self.datetime)
        BuildProject.__init__(self, uri, foldername, tmpdir=testpath, dl_dir=dl_dir)

    def download_archive(self):
        self._download_archive()

        cmd = 'tar xf %s -C %s' % (os.path.join(self.targetdir, self.archive), self.targetdir)
        subprocess.check_output(cmd, shell=True)

        #Change targetdir to project folder
        self.targetdir = os.path.join(self.targetdir, self.fname)

    def run_configure(self, configure_args='', extra_cmds=''):
        return super(SDKBuildProject, self).run_configure(configure_args=(configure_args or '$CONFIGURE_FLAGS'), extra_cmds=extra_cmds)

    def run_install(self, install_args=''):
        return super(SDKBuildProject, self).run_install(install_args=(install_args or "DESTDIR=%s/../install" % self.targetdir))

    def log(self, msg):
        if self.logfile:
            with open(self.logfile, "a") as f:
               f.write("%s\n" % msg)

    def _run(self, cmd):
        self.log("Running . %s; " % self.sdkenv + cmd)
        try:
            output = subprocess.check_output(". %s; " % self.sdkenv + cmd, shell=True, stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError as exc:
            print(exc.output.decode('utf-8'))
            return exc.returncode
        return 0
