#!/usr/bin/python

import sys
import argparse
import mysql.connector as mariadb
import json
import epg_db
import system_defines


def limitedPrint(item, name="response"):
    if isinstance(item, list):
        for i in range(0, min(5, len(item))):
            limitedPrint(item[i], "")
        if len(item) > 5:
            print "-->> Only printed first 5 entries"
    elif isinstance(item, dict):
        hasList = False
        for key in item:
            if isinstance(item[key], list):
                hasList = True
        if hasList:
            for key in item:
                limitedPrint(item[key], key)
        else:
            print name, item
    else:
        print name, item


def printResponse(response):
    if args.nicePrint:
        limitedPrint(response)
    else:
        jsonResp = json.dumps(response)
        print jsonResp


parser = argparse.ArgumentParser(description="Electronic Program Guide management app")
parser.add_argument("-v", '--version', action='version', version='%(prog)s 0.1')
parser.add_argument('--nice_print', dest='nicePrint', action="store_true")

parser.add_argument('--delete_db', action="store_true")
parser.add_argument('--update_db', action="store_true")

parser.add_argument('--add_integrator', nargs=2, metavar=("integrator", "password"))
parser.add_argument('--check_integrator_password', nargs=2, metavar=("integrator", "password"))
parser.add_argument('--change_integrator_password', nargs=2, metavar=("integrator", "password"))
parser.add_argument('--delete_integrator', nargs=1, metavar=("integrator"))
parser.add_argument('--get_integrators', action="store_true")

parser.add_argument('--get_countries', action="store_true")
parser.add_argument('--get_providers', nargs=2, metavar=("country", "postal-code"))
parser.add_argument('--add_epg', nargs=8, metavar=("epgId", "integrator", "epg_name", "RF|IP", "country", "postal-code", "providerIds", "newProviderOk"))
parser.add_argument('--change_epg', nargs=8, metavar=("epgId", "integrator", "epg_name", "RF|IP", "country", "postal-code", "providerIds", "newProviderOk"))
parser.add_argument('--validate_epg', nargs=1, metavar=("epgId"))
parser.add_argument('--delete_epg', nargs=1, metavar=("epgId"))
parser.add_argument('--get_epgs', nargs=1, metavar=("integrator"))

parser.add_argument('--add_local_channel', nargs=3, metavar=("epg_id", "callSign", "channel-name"))
parser.add_argument('--change_local_channel', nargs=4, metavar=("epgId", "channel_id", "callSign", "channel-name"))
parser.add_argument('--delete_local_channel', nargs=2, metavar=("epg_id", "channelId"))

parser.add_argument('--get_epg_channels', nargs=1, metavar=("epgId"))
parser.add_argument('--set_epg_channels', nargs="+", metavar=("epgId", "channel-id;local-channel-num;contentUrl"))

parser.add_argument('--save_epg_config', nargs=5, metavar=("epgId", "backgroundColor", "fontColor", "evenRowColor", "oddRowColor"))
parser.add_argument('--get_epg_programs', nargs=2, metavar=("epgId", "lastReqId"))

parser.add_argument('--update_all_channels_info', action="store_true")
parser.add_argument('--get_update_all_channels_info_status', action="store_true")

parser.add_argument('--update_all_programs', action="store_true")
# parser.add_argument('--get_programs', nargs=1, metavar=("channel-id"))

parser.add_argument('--show_epgs', action="store_true")
parser.add_argument('--show_providers', action="store_true")
parser.add_argument('--show_channels', action="store_true")
parser.add_argument('--show_provider_channels', nargs=1, metavar=("providerId"))


args = parser.parse_args()

if args.delete_db:
    epg_db.resetDb()

if args.update_db:
    epg_db.updateDb()

mariadb_connection = mariadb.connect(user='root', password=system_defines.mariaDbPassword)
cursor = mariadb_connection.cursor(buffered=True)
try:
    cursor.execute("use zvepg")
except mariadb.Error as error:
    response = {}
    response["error"] = "ErrMsg"
    response["errorMsg"] = "Database server not running"
    print json.dumps(response)
    sys.exit()
cursor.close()

epg_db.updateDb()

if args.add_integrator:
    response = epg_db.addIntegrator(args.add_integrator[0], args.add_integrator[1])
    printResponse(response)

if args.check_integrator_password:
    response = epg_db.checkIntegratorPassword(args.check_integrator_password[0], args.check_integrator_password[1])
    printResponse(response)

if args.change_integrator_password:
    response = epg_db.changeIntegratorPassword(args.change_integrator_password[0], args.change_integrator_password[1])
    printResponse(response)

if args.delete_integrator:
    response = epg_db.delIntegrator(args.delete_integrator[0])
    printResponse(response)

if args.get_countries:
    response = epg_db.getCountries()
    printResponse(response)

if args.get_providers:
    response = epg_db.getProviders(args.get_providers[0], args.get_providers[1])
    printResponse(response)

if args.get_integrators:
    response = epg_db.getIntegrators()
    printResponse(response)

if args.add_epg:
    response = epg_db.addEpg(args.add_epg[0], args.add_epg[1], args.add_epg[2], args.add_epg[3],
                             args.add_epg[4], args.add_epg[5], args.add_epg[6], args.add_epg[7])
    printResponse(response)

if args.change_epg:
    response = epg_db.changeEpg(args.change_epg[0], args.change_epg[1], args.change_epg[2], args.change_epg[3], args.change_epg[4],
                                args.change_epg[5], args.change_epg[6], args.change_epg[7])
    printResponse(response)

if args.delete_epg:
    response = epg_db.delEpg(args.delete_epg[0])
    printResponse(response)

if args.validate_epg:
    response = epg_db.validateEpg(args.validate_epg[0])
    printResponse(response)

if args.get_epgs:
    response = epg_db.getEpgs(args.get_epgs[0])
    printResponse(response)

if args.add_local_channel:
    response = epg_db.addLocalChannel(args.add_local_channel[0], args.add_local_channel[1], args.add_local_channel[2])
    printResponse(response)

if args.change_local_channel:
    response = epg_db.changeLocalChannel(args.change_local_channel[0], args.change_local_channel[1], args.change_local_channel[2],
                                         args.change_local_channel[3])
    printResponse(response)

if args.delete_local_channel:
    response = epg_db.deleteLocalChannel(args.delete_local_channel[0], args.delete_local_channel[1])
    printResponse(response)

if args.get_epg_channels:
    response = epg_db.getEpgChannels(args.get_epg_channels[0])
    printResponse(response)

if args.set_epg_channels:
    response = epg_db.setEpgChannels(args.set_epg_channels[0], args.set_epg_channels[1:])
    printResponse(response)

if args.save_epg_config:
    response = epg_db.saveEpgConfig(args.save_epg_config[0], args.save_epg_config[1], args.save_epg_config[2], args.save_epg_config[3],
                                    args.save_epg_config[4])
    printResponse(response)

if args.get_epg_programs:
    response = epg_db.getEpgPrograms(args.get_epg_programs[0], args.get_epg_programs[1])
    printResponse(response)

if args.update_all_channels_info:
    response = epg_db.updateAllChannelsInfo()
    printResponse(response)

if args.get_update_all_channels_info_status:
    response = epg_db.getUpdateAllChannelsInfoStatus()
    printResponse(response)

if args.update_all_programs:
    response = epg_db.updateAllChannelPrograms()
    printResponse(response)

# ./epg.py --get_programs wcbv/abc=11369  wbz/cbs=11325 11418  tnt=11164    11369:6 11325:7 11418:8 tnt=11164:9
# if args.test_get_programs:
#    response = epg_grace.getPrograms(args.get_programs[0])
#    printResponse(response)

if args.show_epgs:
    epg_db.showEpgs()

if args.show_providers:
    epg_db.showProviders()

if args.show_channels:
    epg_db.showChannels()

if args.show_provider_channels:
    epg_db.showProviderChannels(args.show_provider_channels[0])
