#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys
import shutil
import logging
import time

# Currently supported pgoapi
pgoapi_version = "1.1.6"

# Moved here so logger is configured at load time
logging.basicConfig(format='%(asctime)s [%(threadName)16s][%(module)14s][%(levelname)8s] %(message)s')
log = logging.getLogger()

# Make sure pogom/pgoapi is actually removed if it is an empty directory
# This is a leftover directory from the time pgoapi was embedded in PokemonGo-Map
# The empty directory will cause problems with `import pgoapi` so it needs to go
oldpgoapiPath = os.path.join(os.path.dirname(__file__), "pogom/pgoapi")
if os.path.isdir(oldpgoapiPath):
    log.info("I found %s, but its no longer used. Going to remove it...", oldpgoapiPath)
    shutil.rmtree(oldpgoapiPath)
    log.info("Done!")

# Ensure user has updated to the new api
try:
    import pgoapi
except:
    log.critical("Was not able to import pgoapi. Try running pip install -r requirements.txt")
    sys.exit(1)

if pgoapi.__version__ != pgoapi_version:
    log.critical("Your pgoapi version (%s) appears to be out of date. Try running pip install -r requirements.txt", pgoapi.__version__)
    sys.exit(1)

from threading import Thread, Event
from queue import Queue
from flask_cors import CORS

from pogom import config
from pogom.app import Pogom
from pogom.utils import get_args, insert_mock_data

from pogom.search import search_overseer_thread, fake_search_loop
from pogom.models import init_database, create_tables, drop_tables, Pokemon, Pokestop, Gym

from pgoapi import utilities as util

if __name__ == '__main__':
    args = get_args()

    if args.debug:
        log.setLevel(logging.DEBUG);
    else:
        log.setLevel(logging.INFO);

    # Let's not forget to run Grunt / Only needed when running with webserver
    if not args.no_server:
        if not os.path.exists(os.path.join(os.path.dirname(__file__), 'static/dist')):
            log.critical('Please run "grunt build" before starting the server');
            sys.exit();

    # These are very noisey, let's shush them up a bit
    logging.getLogger('peewee').setLevel(logging.INFO)
    logging.getLogger('requests').setLevel(logging.WARNING)
    logging.getLogger('pgoapi.pgoapi').setLevel(logging.WARNING)
    logging.getLogger('pgoapi.rpc_api').setLevel(logging.INFO)
    logging.getLogger('werkzeug').setLevel(logging.ERROR)

    config['parse_pokemon'] = not args.no_pokemon
    config['parse_pokestops'] = not args.no_pokestops
    config['parse_gyms'] = not args.no_gyms

    # Turn these back up if debugging
    if args.debug:
        logging.getLogger('requests').setLevel(logging.DEBUG)
        logging.getLogger('pgoapi').setLevel(logging.DEBUG)
        logging.getLogger('rpc_api').setLevel(logging.DEBUG)


    position = util.get_pos_by_name(args.location)
    if not any(position):
        log.error('Could not get a position by name, aborting')
        sys.exit()

    log.info('Parsed location is: %.4f/%.4f/%.4f (lat/lng/alt)',
             position[0], position[1], position[2])

    if args.no_pokemon:
        log.info('Parsing of Pokemon disabled')
    if args.no_pokestops:
        log.info('Parsing of Pokestops disabled')
    if args.no_gyms:
        log.info('Parsing of Gyms disabled')

    config['LOCALE'] = args.locale
    config['CHINA'] = args.china

    app = Pogom(__name__)
    db = init_database(app)
    if args.clear_db:
        log.info('Clearing database')
        if args.db_type == 'mysql':
            drop_tables(db)
        elif os.path.isfile(args.db):
            os.remove(args.db)
    create_tables(db)

    app.set_current_location(position);

    # Control the search status (running or not) across threads
    pause_bit = Event()
    pause_bit.clear()

    # Setup the location tracking queue and push the first location on
    new_location_queue = Queue()
    new_location_queue.put(position)

    if not args.only_server:
        # Gather the pokemons!
        if not args.mock:
            log.debug('Starting a real search thread')
            search_thread = Thread(target=search_overseer_thread, args=(args, new_location_queue, pause_bit))
        else:
            log.debug('Starting a fake search thread')
            insert_mock_data(position)
            search_thread = Thread(target=fake_search_loop)

        search_thread.daemon = True
        search_thread.name = 'search_thread'
        search_thread.start()

    if args.cors:
        CORS(app);

    app.set_search_control(pause_bit)
    app.set_location_queue(new_location_queue)

    config['ROOT_PATH'] = app.root_path
    config['GMAPS_KEY'] = args.gmaps_key

    if args.no_server:
        # This loop allows for ctrl-c interupts to work since flask won't be holding the program open
        while search_thread.is_alive():
            time.sleep(60)
    else:
        app.run(threaded=True, use_reloader=False, debug=args.debug, host=args.host, port=args.port)

@@ -826,46 +826,34 @@
 %0A%0A# 
-Ensure user has updated to the new api
+Assert pgoapi is installed
 %0Atry
@@ -878,16 +878,28 @@
 i%0Aexcept
+ ImportError
 :%0A    lo
@@ -914,50 +914,56 @@
 al(%22
-Was not able to import pgoapi. Try running
+It seems %60pgoapi%60 is not installed. You must run
  pip
@@ -990,16 +990,22 @@
 ents.txt
+ again
 %22)%0A    s
@@ -1020,33 +1020,181 @@
 1)%0A%0A
-if pgoapi.__version__ != 
+# Assert pgoapi %3E= 1.1.6 is installed%0Afrom distutils.version import StrictVersion%0Aif not hasattr(pgoapi, %22__version__%22) or StrictVersion(pgoapi.__version__) %3C StrictVersion(
 pgoa
@@ -1203,16 +1203,17 @@
 _version
+)
 :%0A    lo
@@ -1228,71 +1228,57 @@
 al(%22
-Your pgoapi version (%25s) appears to be out of date. Try running
+It seems %60pgoapi%60 is not up-to-date. You must run
  pip
@@ -1309,29 +1309,15 @@
 .txt
-%22, pgoapi.__version__
+ again%22
 )%0A  

correct assertions to check for pgoapi being installed and up-to-date (#3387)