#!/usr/bin/python
# Copyright (c) 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import errno
import subprocess
import sys

PLUTIL = ['/usr/bin/env', 'xcrun', 'plutil']

IBTOOL = [
    '/usr/bin/env',
    'xcrun',
    'ibtool',
]


def MakeDirectories(path):
    try:
        os.makedirs(path)
    except OSError as exc:
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            return 0
        else:
            return -1

    return 0


def ProcessInfoPlist(args):
    output_plist_file = os.path.abspath(os.path.join(args.output, 'Info.plist'))
    return subprocess.check_call(PLUTIL + [
        '-convert',
        'binary1',
        '-o',
        output_plist_file,
        '--',
        args.input,
    ])


def ProcessNIB(args):
    output_nib_file = os.path.join(
        os.path.abspath(args.output),
        "%s.nib" % os.path.splitext(os.path.basename(args.input))[0])

    return subprocess.check_call(IBTOOL + [
        '--module',
        args.module,
        '--auto-activate-custom-fonts',
        '--target-device',
        'mac',
        '--compile',
        output_nib_file,
        os.path.abspath(args.input),
    ])


def GenerateProjectStructure(args):
    application_path = os.path.join(args.dir, args.name + ".app", "Contents")
    return MakeDirectories(application_path)


def Main():
    parser = argparse.ArgumentParser(description='A script that aids in '
                                     'the creation of an Mac application')

    subparsers = parser.add_subparsers()

    # Plist Parser

    plist_parser = subparsers.add_parser('plist', help='Process the Info.plist')
    plist_parser.set_defaults(func=ProcessInfoPlist)

    plist_parser.add_argument('-i', dest='input', help='The input plist path')
    plist_parser.add_argument('-o', dest='output', help='The output plist dir')

    # NIB Parser

    plist_parser = subparsers.add_parser('nib', help='Process a NIB file')
    plist_parser.set_defaults(func=ProcessNIB)

    plist_parser.add_argument('-i', dest='input', help='The input nib path')
    plist_parser.add_argument('-o', dest='output', help='The output nib dir')
    plist_parser.add_argument('-m', dest='module', help='The module name')

    # Directory Structure Parser

    dir_struct_parser = subparsers.add_parser(
        'structure', help='Creates the directory of an Mac application')

    dir_struct_parser.set_defaults(func=GenerateProjectStructure)

    dir_struct_parser.add_argument('-d', dest='dir', help='Out directory')
    dir_struct_parser.add_argument('-n', dest='name', help='App name')

    # Engage!

    args = parser.parse_args()

    return args.func(args)


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