#!/usr/local/cpython-3.4/bin/python3

# pylint: disable=superfluous-parens
# superfluous-parens: Parentheses are good for portability and readability

'''
Copy stat data from --source to --dest.
This pretty much just wraps shutil.copystat()
'''

import os
import sys
# port pprint
import shutil


def usage(retval):
    # pylint: disable=invalid-name
    # invalid-name: I want a short name here; it's still clear
    '''Output a usage message'''
    w = sys.stderr.write
    w('Usage: {}\n'.format(sys.argv[0]))
    w('    --source source/filename\n')
    w('    --dest dest/filename\n')
    w('    --prefix /common/prefix\n')
    w('    --help\n')
    w('    -h\n')
    w('    --verbose\n')
    w('    -v\n')
    w('\n')
    w('Copy stat data from /source/filename to /dest/filename.\n')
    w('If --prefix is given, copy stat data from /common/prefix/source/filename to /common/prefix/dest/filename.\n')
    sys.exit(retval)


class Options(object):
    # pylint: disable=too-few-public-methods
    # too-few-public-methods: We're primarily a container;
    #     of course we don't need a lot of public methods
    '''
    Parse command line options.
    We don't do it a shorter way to maximize the benefits of pylint.
    '''

    def __init__(self):
        self.source = None
        self.dest = None
        self.prefix = None
        self.verbose = False

        while sys.argv[1:]:
            if sys.argv[1] == '--prefix':
                self.prefix = sys.argv[2]
                del sys.argv[1]
            elif sys.argv[1] == '--source':
                self.source = sys.argv[2]
                del sys.argv[1]
            elif sys.argv[1] == '--dest':
                self.dest = sys.argv[2]
                del sys.argv[1]
            elif sys.argv[1] in ['-h', '--help']:
                usage(0)
            elif sys.argv[1] in ['-v', '--verbose']:
                self.verbose = True
            else:
                sys.stderr.write('{}: Unrecognized option: {}\n'.format(sys.argv[0], sys.argv[1]))
                usage(1)
            del sys.argv[1]

        if self.source is None:
            sys.stderr.write('{}: --source is required\n'.format(sys.argv[0]))
            usage(1)

        if self.dest is None:
            sys.stderr.write('{}: --dest is required\n'.format(sys.argv[0]))
            usage(1)

        if self.prefix is not None:
            self.source = os.path.join(self.prefix, self.source)
            self.dest = os.path.join(self.prefix, self.dest)


def main():
    '''Main function'''
    options = Options()

    if os.path.isfile(options.source) and os.path.isfile(options.dest):
        if options.verbose:
            print('Copying stat data from {} to {}'.format(options.source, options.dest))
        shutil.copystat(options.source, options.dest)
    else:
        if options.verbose:
            print('--source filename or --dest filename not extent')

main()