#!/usr/bin/env python3
#
# Copyright (c) 2023, 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.

import optparse
import os
import shutil
import subprocess
import sys
from os.path import join, split, abspath, dirname

sys.path.append(join(dirname(__file__), '..'))
import utils

DART_DIR = abspath(join(dirname(__file__), '..', '..'))


def BuildOptions():
    result = optparse.OptionParser()
    result.add_option("--version", default=None)
    result.add_option("--arch", default=None)
    result.add_option("--lib_dir", default=None)
    return result


def GenerateCopyright(filename):
    with open(join(DART_DIR, 'LICENSE')) as lf:
        license_lines = lf.readlines()

    with open(filename, 'w') as f:
        f.write('Name: dart\n')
        f.write('Maintainer: Dart Team <misc@dartlang.org>\n')
        f.write('Source: https://dart.googlesource.com/sdk\n')
        f.write('License:\n')
        for line in license_lines:
            f.write(' %s' % line)  # Line already contains trailing \n.


def GenerateChangeLog(filename, version):
    with open(filename, 'w') as f:
        f.write('dart (%s-1) UNRELEASED; urgency=low\n' % version)
        f.write('\n')
        f.write('  * Generated file.\n')
        f.write('\n')
        f.write(' -- Dart Team <misc@dartlang.org>\n')


def Main():
    parser = BuildOptions()
    (options, args) = parser.parse_args()

    version = options.version
    versiondir = 'dart-%s' % version
    shutil.copytree(join(DART_DIR, 'tools', 'debian_package', 'debian'),
                    join(versiondir, 'debian'),
                    dirs_exist_ok=True)
    GenerateCopyright(join(versiondir, 'debian', 'copyright'))
    GenerateChangeLog(join(versiondir, 'debian', 'changelog'), version)

    cmd = ['dpkg-buildpackage', '-B', '-a', options.arch, '-us', '-uc']
    env = os.environ.copy()
    env["LIB_DIR"] = options.lib_dir
    process = subprocess.check_call(cmd, cwd=versiondir, env=env)


if __name__ == '__main__':
    sys.exit(Main())
