import argparse
import base64
from collections import Counter, OrderedDict
import os
from progress.bar import Bar
from wand.image import Image
import worldmap
from bookstack import Bookstack
from vcinema_utils import VCinemaUtils
FLAGS = {
    "Australia": "🇦🇺",
    "Belgium": "🇧🇪",
    "Canada": "🇨🇦",
    "China": "🇨🇳",
    "Czech Republic": "🇨🇿",
    "Czechia": "🇨🇿",
    "France": "🇫🇷",
    "Germany": "🇩🇪",
    "Hong Kong": "🇭🇰",
    "Hong Kong SAR China": "🇭🇰",
    "Italy": "🇮🇹",
    "Israel": "🇮🇱",
    "Japan": "🇯🇵",
    "Luxembourg": "🇱🇺",
    "Mexico": "🇲🇽",
    "New Zealand": "🇳🇿",
    "Nigeria": "🇳🇬",
    "North Korea": "🇰🇵",
    "Philippines": "🇵🇭",
    "Russia": "🇷🇺",
    "Spain": "🇪🇸",
    "South Africa": "🇿🇦",
    "South Korea": "🇰🇷",
    "Taiwan": "🇹🇼",
    "Thailand": "🇹🇭",
    "Turkey": "🇹🇷",
    "Uganda": "🇺🇬",
    "United Kingdom": "🇬🇧",
    "United States": "🇺🇸",
    "West Germany": "⬅️🇩🇪",
}
def build_table(fby, bar):
    fby_sorted = OrderedDict(sorted(fby.items(), key=lambda t: t[0]))
    table = "
"
    table += "| Country | Films | 
|---|
"
    table += ""
    for country in fby_sorted.keys():
        row = ""
        row += "| "
        row += "{} {}".format(str(country), FLAGS[country])
        row += ""
        row += " | "
        row += " "
        row += "".join(["{}".format(film['imdb_id'], film['title']) for film in fby_sorted[country]])
        row += "
 | 
"
        table += row
        bar.next()
    table += ""
    table += "
"
    return table
def draw_map(counter, file_name="vcinema_map.svg"):
    countries = [k for k, v in counter.items()]
    counts = [len(v) for _, v in counter.items()]
    max_count = max(counts)
    opacity = [0.5 + (x / (float(max_count))/2.0) for x in counts]
    worldmap.plot(countries, cmap=["#ff0000"], opacity=opacity, filename=file_name, verbose=False)
    with Image(filename=file_name, width=1000, height=655) as i:
        png_data = i.make_blob("png")
    os.remove(file_name)
    return png_data
def update_page(map_png, table, wiki_url, token_id, token_secret):
    page_id = 34
    encoded = base64.b64encode(map_png).decode("utf-8")
    image_html = " ".format(encoded)
    page_contents = image_html + table
    Bookstack.update_page(wiki_url, token_id, token_secret, page_id, html=page_contents)
def update_films_by_country_page(token_id, token_secret):
    print("Retrieving VCinema viewings")
    viewings = VCinemaUtils.get_vcinema_viewings(token_id, token_secret)
    viewing_count = len(viewings)
    with Bar('Retrieving movie data', max=viewing_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
        VCinemaUtils.add_imdb_data_to_viewings(viewings, ['countries'], bar)
    with Bar('Processing viewing data', max=viewing_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
        viewings_by_country = VCinemaUtils.filter_viewings(viewings, 'countries', bar)
    country_count = len(viewings_by_country.keys())
    with Bar('Generating table', max=country_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
        film_by_country_table = build_table(viewings_by_country, bar)
    country_counter = Counter(viewings_by_country)
    png_data = draw_map(country_counter)
    update_page(png_data, film_by_country_table, VCinemaUtils.JACKNET_WIKI_URL, token_id, token_secret)
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Update page displaying VCinema films sorted by country.')
    parser.add_argument('token_id', help='API token ID.')
    parser.add_argument('token_secret', help='API token secret.')
    args = parser.parse_args()
    update_films_by_country_page(args.token_id, args.token_secret)
".format(encoded)
    page_contents = image_html + table
    Bookstack.update_page(wiki_url, token_id, token_secret, page_id, html=page_contents)
def update_films_by_country_page(token_id, token_secret):
    print("Retrieving VCinema viewings")
    viewings = VCinemaUtils.get_vcinema_viewings(token_id, token_secret)
    viewing_count = len(viewings)
    with Bar('Retrieving movie data', max=viewing_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
        VCinemaUtils.add_imdb_data_to_viewings(viewings, ['countries'], bar)
    with Bar('Processing viewing data', max=viewing_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
        viewings_by_country = VCinemaUtils.filter_viewings(viewings, 'countries', bar)
    country_count = len(viewings_by_country.keys())
    with Bar('Generating table', max=country_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
        film_by_country_table = build_table(viewings_by_country, bar)
    country_counter = Counter(viewings_by_country)
    png_data = draw_map(country_counter)
    update_page(png_data, film_by_country_table, VCinemaUtils.JACKNET_WIKI_URL, token_id, token_secret)
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Update page displaying VCinema films sorted by country.')
    parser.add_argument('token_id', help='API token ID.')
    parser.add_argument('token_secret', help='API token secret.')
    args = parser.parse_args()
    update_films_by_country_page(args.token_id, args.token_secret)