import logging
import traceback
import argparse
from lbry.wallet.server.env import Env
from lbry.wallet.server.block_processor import BlockProcessor
from lbry.wallet.server.chain_reader import BlockchainReaderServer
from lbry.wallet.server.db.elasticsearch.sync import ElasticWriter


def get_args_and_setup_logging(name):
    parser = argparse.ArgumentParser(
        prog=name
    )
    Env.contribute_to_arg_parser(parser)
    args = parser.parse_args()
    logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)-4s %(name)s:%(lineno)d: %(message)s")
    logging.getLogger('aiohttp').setLevel(logging.WARNING)
    logging.getLogger('elasticsearch').setLevel(logging.WARNING)
    return args


def run_writer_forever():
    args = get_args_and_setup_logging('lbry-hub-writer')
    try:
        block_processor = BlockProcessor(Env.from_arg_parser(args))
        block_processor.run()
    except Exception:
        traceback.print_exc()
        logging.critical('block processor terminated abnormally')
    else:
        logging.info('block processor terminated normally')


def run_server_forever():
    args = get_args_and_setup_logging('lbry-hub-server')

    try:
        server = BlockchainReaderServer(Env.from_arg_parser(args))
        server.run()
    except Exception:
        traceback.print_exc()
        logging.critical('server terminated abnormally')
    else:
        logging.info('server terminated normally')


def run_es_sync_forever():
    args = get_args_and_setup_logging('lbry-hub-elastic-sync')
    try:
        server = ElasticWriter(Env.from_arg_parser(args))
        server.run()
    except Exception:
        traceback.print_exc()
        logging.critical('es writer terminated abnormally')
    else:
        logging.info('es writer terminated normally')