# 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 errno
import os
import subprocess
import sys

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([
    '/usr/bin/env',
    'xcrun',
    '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([
    '/usr/bin/env',
    'xcrun',
    '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')

  args = parser.parse_args()
  return args.func(args)


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