#!/usr/bin/env python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

import os

import yaml

FIXTURE_DIR = os.path.join(os.path.dirname(__file__),
                           'fixtures')
CONFIG_DIR = os.path.join(FIXTURE_DIR, 'config')


def make_playbook(path):
    d = os.path.dirname(path)
    try:
        os.makedirs(d)
    except OSError:
        pass
    with open(path, 'w') as f:
        f.write('- hosts: all\n')
        f.write('  tasks: []\n')


def handle_repo(path):
    print('Repo: %s' % path)
    config_path = None
    for fn in ['zuul.yaml', '.zuul.yaml']:
        if os.path.exists(os.path.join(path, fn)):
            config_path = os.path.join(path, fn)
            break
    config = yaml.safe_load(open(config_path))
    for block in config:
        if 'job' not in block:
            continue
        job = block['job']['name']
        playbook = os.path.join(path, 'playbooks', job + '.yaml')
        if not os.path.exists(playbook):
            print('  Creating: %s' % job)
            make_playbook(playbook)


def main():
    repo_dirs = []

    for root, dirs, files in os.walk(CONFIG_DIR):
        if 'zuul.yaml' in files or '.zuul.yaml' in files:
            repo_dirs.append(root)

    for path in repo_dirs:
        handle_repo(path)


if __name__ == '__main__':
    main()
