#!/usr/bin/python3

import argparse
import collections
import json
import logging
import os
import subprocess

from debian_cloud_images.utils import argparse_ext
from debian_cloud_images.api.cdo.build import Build
from debian_cloud_images.api.registry import registry as api_registry
from debian_cloud_images.api import wellknown


class CloudRelease(collections.OrderedDict):
    env = [
        ('id', 'CLOUD_RELEASE_ID'),
        ('version', 'CLOUD_RELEASE_VERSION'),
        ('azure_version', 'CLOUD_RELEASE_VERSION_AZURE'),
        ('build_info_url', 'CI_JOB_URL'),
    ]

    def __init__(self):
        super().__init__()
        for name, env in self.env:
            v = os.environ.get(env)
            if v:
                self[name] = v

    def write(self, f):
        for k, v in self.items():
            print('{}="{}"'.format(k.upper(), v), file=f)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--info',
        action=argparse_ext.ActionEnv,
        env='CLOUD_BUILD_INFO',
    )
    parser.add_argument('--name',
        action=argparse_ext.ActionEnv,
        env='CLOUD_BUILD_NAME',
    )
    parser.add_argument('--output-dir',
        action=argparse_ext.ActionEnv,
        env='CLOUD_BUILD_OUTPUT_DIR',
    )
    parser.add_argument('--root',
        action=argparse_ext.ActionEnv,
        env='FAI_ROOT',
    )
    parser.add_argument('--write',
        action=argparse_ext.ActionEnv,
        required=False,
        env='FAI_ACTION',
    )

    args = parser.parse_args()

    cloud_release = CloudRelease()
    build_info = json.loads(args.info)

    with subprocess.Popen(
        ('dpkg-query', '-W', '--admindir', os.path.join(args.root, 'var/lib/dpkg')),
        stdout=subprocess.PIPE,
    ) as f:
        packages = []
        for l in f.stdout:
            package, version = l.decode().strip().split()
            packages.append({'name': package, 'version': version})

    manifest = Build(info=build_info, packages=packages)
    manifest.metadata.labels[wellknown.label_cdo_vendor] = build_info['vendor']
    manifest.metadata.labels[wellknown.label_cdo_version] = build_info['version']
    manifest.metadata.labels[wellknown.label_do_arch] = build_info['arch']
    manifest.metadata.labels[wellknown.label_do_dist] = 'debian'
    manifest.metadata.labels[wellknown.label_do_release] = build_info['release']
    if build_info['type'] == 'dev':
        manifest.metadata.labels[wellknown.label_bcdo_build_id] = build_info['build_id']
        manifest.metadata.labels[wellknown.label_bcdo_type] = build_info['type']

    with open('{}/{}.build.json'.format(args.output_dir, args.name), 'w') as f:
        json.dump(api_registry.dump(manifest), f, indent=4, separators=(',', ': '), sort_keys=True)

    if args.write:
        with open(os.path.join(args.root, 'etc/cloud-release'), 'w') as f:
            cloud_release.write(f)
