#!/usr/bin/python
#
# Simple utility script to generate the basic info
# needed in a .pc (pkg-config) file, used especially
# for introspection purposes

# This can be used in various projects where
# there is the need to generate .pc files,
# and is copied from GLib's $(srcroot)/build/win32

# Author: Fan, Chun-wei
# Date: March 10, 2016

import os
import sys
import argparse

class BasePCItems:
    def __init__(self):
        self.base_replace_items = {}
        self.exec_prefix = ''
        self.includedir = ''
        self.libdir = ''
        self.prefix = ''
        self.srcdir = os.path.dirname(__file__)
        self.top_srcdir = self.srcdir + '\\..\\..'
        self.version = ''

    def setup(self, argv, parser=None):
        if parser is None:
            parser = argparse.ArgumentParser(description='Setup basic .pc file info')
        parser.add_argument('--prefix', help='prefix of the installed library',
                            required=True)
        parser.add_argument('--exec-prefix',
                            help='prefix of the installed programs, \
                                  if different from the prefix')
        parser.add_argument('--includedir',
                            help='includedir of the installed library, \
                                  if different from ${prefix}/include')
        parser.add_argument('--libdir',
                            help='libdir of the installed library, \
                                  if different from ${prefix}/lib')
        parser.add_argument('--version', help='Version of the package',
                            required=True)
        args = parser.parse_args()

        self.version = args.version

        # check whether the prefix and exec_prefix are valid
        if not os.path.exists(args.prefix):
            raise SystemExit('Specified prefix \'%s\' is invalid' % args.prefix)

        # use absolute paths for prefix
        self.prefix = os.path.abspath(args.prefix).replace('\\','/')

        # check and setup the exec_prefix
        if getattr(args, 'exec_prefix', None) is None:
            exec_prefix_use_shorthand = True
            self.exec_prefix = '${prefix}'
        else:
            if args.exec_prefix.startswith('${prefix}'):
                exec_prefix_use_shorthand = True
                input_exec_prefix = args.prefix + args.exec_prefix[len('${prefix}'):]
            else:
                exec_prefix_use_shorthand = False
                input_exec_prefix = args.exec_prefix
            if not os.path.exists(input_exec_prefix):
                raise SystemExit('Specified exec_prefix \'%s\' is invalid' %
                                  args.exec_prefix)
            if exec_prefix_use_shorthand is True:
                self.exec_prefix = args.exec_prefix.replace('\\','/')
            else:
                self.exec_prefix = os.path.abspath(input_exec_prefix).replace('\\','/')

        # check and setup the includedir
        if getattr(args, 'includedir', None) is None:
            self.includedir = '${prefix}/include'
        else:
            if args.includedir.startswith('${prefix}'):
                includedir_use_shorthand = True
                input_includedir = args.prefix + args.includedir[len('${prefix}'):]
            else:
                if args.includedir.startswith('${exec_prefix}'):
                    includedir_use_shorthand = True
                    input_includedir = input_exec_prefix + args.includedir[len('${exec_prefix}'):]
                else:
                    includedir_use_shorthand = False
                    input_includedir = args.includedir
            if not os.path.exists(input_includedir):
                raise SystemExit('Specified includedir \'%s\' is invalid' %
                                  args.includedir)
            if includedir_use_shorthand is True:
                self.includedir = args.includedir.replace('\\','/')
            else:
                self.includedir = os.path.abspath(input_includedir).replace('\\','/')

        # check and setup the libdir
        if getattr(args, 'libdir', None) is None:
            self.libdir = '${prefix}/lib'
        else:
            if args.libdir.startswith('${prefix}'):
                libdir_use_shorthand = True
                input_libdir = args.prefix + args.libdir[len('${prefix}'):]
            else:
                if args.libdir.startswith('${exec_prefix}'):
                    libdir_use_shorthand = True
                    input_libdir = input_exec_prefix + args.libdir[len('${exec_prefix}'):]
                else:
                    libdir_use_shorthand = False
                    input_libdir = args.libdir
            if not os.path.exists(input_libdir):
                raise SystemExit('Specified libdir \'%s\' is invalid' %
			                      args.libdir)
            if libdir_use_shorthand is True:
                self.libdir = args.libdir.replace('\\','/')
            else:
                self.libdir = os.path.abspath(input_libdir).replace('\\','/')

        # setup dictionary for replacing items in *.pc.in
        self.base_replace_items.update({'@VERSION@': self.version})
        self.base_replace_items.update({'@prefix@': self.prefix})
        self.base_replace_items.update({'@exec_prefix@': self.exec_prefix})
        self.base_replace_items.update({'@libdir@': self.libdir})
        self.base_replace_items.update({'@includedir@': self.includedir})
