#!/usr/bin/python


import base64
import logging
import optparse
import os
import os.path
import random
import shutil
import sys
import tempfile
import time

import koji
import koji_cli as cli

from koji_cli.lib import activate_session
from koji.xmlrpcplus import Fault


def main():
    global koji
    parser = optparse.OptionParser(usage='%prog [options]')
    parser.add_option('-p', '--profile', default='koji', help='pick a profile')
    parser.add_option('--cg-id', help='reserve with cg id first', type='int')
    opts, args = parser.parse_args()

    koji = koji.get_profile_module(opts.profile)

    for name in ('topdir', 'cert', 'serverca'):
        if not hasattr(koji.config, name):
            continue
        value = os.path.expanduser(getattr(koji.config, name))
        setattr(koji.config, name, value)

    session_opts = koji.grab_session_options(koji.config)
    session = koji.ClientSession(koji.config.server, session_opts)
    activate_session(session, koji.config)

    logger = logging.getLogger("koji")
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(name)s: %(message)s'))
    handler.setLevel(logging.DEBUG)
    logger.addHandler(handler)
    logger.setLevel(logging.DEBUG)

    print("Server url: %s" % session.baseurl)

    data = {
            'name': 'test-cg-reserve',
            'version':'1.0',
            }
    for i in range(1, 1000):
        data['release'] = str(i)
        if not session.getBuild(data, strict=False):
            break
    else:
        raise koji.GenericError('Unable to pick release')

    print(data)
    if opts.cg_id:
        res = session.CGInitBuild(opts.cg_id, data)
        print(res)

    metadata = {
            'metadata_version': 0,
            'build': data.copy(),
            'buildroots': [
                {
                    'id': 1,
                    'content_generator': {
                        'name': 'koji',
                        'version': '1.18',
                        },
                    'container': {
                        'arch': 'x86_64',
                        'type': 'chroot',
                        },
                    'host': {
                        'arch': 'x86_64',
                        'os': 'rhel-7',
                        },
                    'components': [],
                    'tools': [],
                }],
            'output': [],
            }

    if opts.cg_id:
        metadata['build']['build_id'] = res['build_id']
    metadata['build']['source'] = 'unknown'
    metadata['build']['start_time'] = 0
    metadata['build']['end_time'] = 100
    metadata['build']['extra'] = {
            'typeinfo': {
                'image': {},
                },
            }

    workdir = tempfile.mkdtemp()
    try:
        fn = '%s/hello.txt' % workdir
        with open(fn, 'w') as fo:
            fo.write('Hello World\n')
        fdata = {
                'filename': 'hello.txt',
                'type': 'file',
                'arch': 'noarch',
                'buildroot_id': 1,
                'filesize': 12,
                'checksum_type': 'md5',
                'checksum': 'e59ff97941044f85df5297e1c302d260',
                'extra': {
                    'typeinfo': {
                        'image': {'arch': 'noarch'}
                        }
                    }
                }
        metadata['output'].append(fdata)
        upath = "cg-reserve-test/%s" % random.random()
        session.uploadWrapper(fn, upath)
        if opts.cg_id:
            session.CGImport(metadata, upath, token=res['token'])
        else:
            session.CGImport(metadata, upath)

    finally:
        shutil.rmtree(workdir)


if __name__ == '__main__':
    main()
