#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import argparse
import logging
import logging.handlers
from pake.shell import rm, mkdir
from pgup import Config as PgupConfig
from pgup import build_init
from pgup import build_diff
from pgup.errors import PgupException

if not os.path.exists(".git"):
    raise PgupException(".git folder not exists. Must run from project root.")

# For adding dynamic dbstructure parameters
config_parser = argparse.ArgumentParser(add_help=False)
config_parser.add_argument("--config", default="/etc/pgup.yaml", help="Path to pgup configuration")
config = config_parser.parse_known_args()[0].config
pgup_config = PgupConfig(config)

parser = argparse.ArgumentParser(description="util for build postgresql structure")
parser.add_argument("--config", default="/etc/pgup.yaml", help="Path to pgup configuration")
parser.add_argument("--commit", default=None, help="Commit which need update, if not exists - build init")
parser.add_argument("--build", default="build/pgup", help="Path for pgup build")
parser.add_argument("--verbose", action="store_true", default=False, help="Puts debug messages")

# Adding dynamic structure parameter, depends on databases section in pgup.yaml
structures = []
for dbname in pgup_config.databases:
    param = "{}_structure".format(dbname)
    parser.add_argument("--{}".format(param), default=None, help="Path to {} structure".format(dbname))
    structures.append((dbname, param))

args = parser.parse_args()
argv = vars(args)

if args.verbose:
    loglvl = logging.DEBUG
else:
    loglvl = logging.INFO

logging.basicConfig(
    level=loglvl,
    format="%(asctime)s - %(levelname)s - %(name)s - %(message)s"
)

logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))
logger = logging.getLogger('pgup')

# Checking, that any of structures exists
ANY_STRUCTURE_EXISTS = False
for dbname, param in structures:
    if argv[param]:
        ANY_STRUCTURE_EXISTS = True
    else:
        logger.info("{} not exists".format(param))

# Remove build directory
if os.path.exists(args.build):
    logging.debug("rm -rf {}".format(args.build))
    rm(u"-rf {}".format(args.build))

mkdir(u"-p {}".format(args.build))

if args.commit:
    build_diff(argv, structures, pgup_config)
elif ANY_STRUCTURE_EXISTS:
    build_init(argv, structures, pgup_config)
else:
    parser.print_help()
