#!/usr/bin/env python3

# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
"""
Buildbot steps for src tarball generation and debian package generation

Package up the src of the dart repo and create a debian package.
Archive tarball and debian package to google cloud storage.
"""

import os
import subprocess
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'bots'))
import bot_utils

utils = bot_utils.GetUtils()

HOST_OS = utils.GuessOS()


def InstallFromDep(builddir):
    for entry in os.listdir(builddir):
        if entry.endswith("_amd64.deb"):
            path = os.path.join(builddir, entry)
            Run(['dpkg', '-i', path])


def UninstallDart():
    Run(['dpkg', '-r', 'dart'])


def CreateDartTestFile(tempdir):
    filename = os.path.join(tempdir, 'test.dart')
    with open(filename, 'w') as f:
        f.write('void main() {\n')
        f.write('  print("Hello world");\n')
        f.write('}')
    return filename


def Run(command):
    print("Running: %s" % ' '.join(command))
    sys.stdout.flush()
    no_color_env = dict(os.environ)
    no_color_env['TERM'] = 'nocolor'
    subprocess.check_call(command, env=no_color_env)


def TestInstallation(assume_installed=True):
    paths = ['/usr/bin/dart', '/usr/lib/dart/bin/dart']
    for path in paths:
        if os.path.exists(path):
            if not assume_installed:
                print('Assumed not installed, found %s' % path)
                sys.exit(1)
        else:
            if assume_installed:
                print('Assumed installed, but could not find %s' % path)
                sys.exit(1)


def SrcSteps():
    version = utils.GetVersion()
    builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
                            'src_and_installation')

    if not os.path.exists(builddir):
        os.makedirs(builddir)
    tarfilename = 'dart-%s.tar.gz' % version
    tarfile = os.path.join(builddir, tarfilename)

    print('Validating that we are on debian bullseye')
    args = ['cat', '/etc/os-release']
    (stdout, stderr, exitcode) = bot_utils.run(args)
    if exitcode != 0:
        print("Could not find linux system, exiting")
        sys.exit(1)
    if not "bullseye" in stdout:
        print("Trying to build Debian bits but not on Debian Bullseye")
        print("You can't fix this, please contact dart-engprod@")
        sys.exit(1)

    print('Building src tarball')
    Run([
        sys.executable, 'tools/linux_dist_support/create_tarball.py',
        '--tar_filename', tarfile
    ])

    print('Building Debian packages')
    Run([
        sys.executable, 'tools/linux_dist_support/create_debian_packages.py',
        '--tar_filename', tarfile, '--out_dir', builddir
    ])

    if os.path.exists('/usr/bin/dart') or os.path.exists(
            '/usr/lib/dart/bin/dart'):
        print("Dart already installed, removing")
        UninstallDart()
    TestInstallation(assume_installed=False)

    InstallFromDep(builddir)
    TestInstallation(assume_installed=True)

    # We build the runtime target to get everything we need to test the
    # standalone target.
    Run([
        sys.executable, 'tools/build.py', '--mode=release', '--arch=x64',
        'runtime'
    ])
    # Copy in the installed binary to avoid polluting /usr/bin (and having to
    # run as root)
    Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])

    # Check dart, dart compile js, and dart analyze against a hello world program
    with utils.TempDir() as temp_dir:
        test_file = CreateDartTestFile(temp_dir)
        Run(['/usr/lib/dart/bin/dart', 'compile', 'js', test_file])
        Run(['/usr/lib/dart/bin/dart', 'analyze', test_file])
        Run(['/usr/lib/dart/bin/dart', test_file])

    UninstallDart()
    TestInstallation(assume_installed=False)


if __name__ == '__main__':
    SrcSteps()
