import pyscript
from pyscript import when, display, fs

import numpy as np
import pandas as pd
# import matplotlib
# import matplotlib.pyplot as plt
from platform import python_version
import pprint
import os
from pathlib import Path

from data import (
    read_portfolio,
    get_random_portfolio,
    read_datasets,
    modify_portfolio,
    plot_portfolio,
    write_portfolio
)

PORTFOLIO_PATH = Path('/local/portfolio.csv')
EXPORT_PATH = Path('/local/export.csv')

user_portfolio: pd.DataFrame|None = None



@when("click", "#mount-button")
async def mount_handler(event):
    print("Mounting local folder...")
    await fs.mount("/local")
    print("Mounted filesystem at /local.")



@when("click", "#load-button")
async def load_handler(event):
    global user_portfolio
    print('Loading file...')

    try:
        # Ensure changes are written to local filesystem.
        await fs.sync("/local")

        user_portfolio = read_portfolio(PORTFOLIO_PATH)
    except Exception as e:
        print("local folder not yet mounted")
        print(e)
        return

    print('File loaded.')

    process_data()
    plot_data()



@when("click", "#load-random-button")
def load_random_handler(event):
    global user_portfolio

    print('Loading random portfolio...')
    user_portfolio = get_random_portfolio(allow_sells=False)
    print('Random portfolio loaded.')

    process_data()
    plot_data()



@when("click", "#print-button")
def print_handler(event):
    print(user_portfolio)



@when("click", "#print-info-button")
def print_info_handler(event):
    print(f"python: {python_version()}")
    print(f"numpy: {np.__version__}")
    print(f"pandas: {pd.__version__}")
    # print(f"matplotlib: {matplotlib.__version__}")
    pprint.pprint(pyscript.config)
    print(os.listdir("."))
    try:
        print(os.listdir("/local"))
    except FileNotFoundError:
        print("local folder not yet mounted")



def process_data():
    print('Processing portfolio...')

    global user_portfolio

    eur_usd_df, btc_usd_df = read_datasets()
    user_portfolio = modify_portfolio(
        portfolio_df=user_portfolio,
        eur_usd_df=eur_usd_df,
        btc_usd_df=btc_usd_df
    )

    print('Portfolio modified.')



def plot_data():
    print("Ploting portfolio...")
    plot_portfolio(portfolio_df=user_portfolio)
    print("Ploting done.")



@when("click", "#save-button")
async def save_handler(event):
    print(f"Writing portfolio to {EXPORT_PATH}...")
    global modified_user_portfolio

    try:
        if user_portfolio is not None:
            await fs.sync("/local")
            write_portfolio(
                portfolio_df=user_portfolio,
                export_path=EXPORT_PATH
                )

    except Exception as e:
        print("local folder not yet mounted")
        print(e)
        return

    print("Writing portfolio done.")



@when("click", "#unmount-button")
async def unmount_handler(event):
    print("Unmounting local folder...")
    # Clean up when done.
    await fs.unmount("/local")
    print("Unmounting done.")
