from shiny import render
from shiny.express import input, ui
import plotly.express as px
import pandas as pd
import matplotlib.pyplot as plt

ui.page_opts(fillable=True)
ui.panel_title("Kmer Analysis")
with ui.layout_columns():
    with ui.card():
        ui.input_slider("kmer", "kmer", 0, 10, 5)
        ui.input_slider("top_k", "top:", 0, 1000, 15)
        
        ui.input_selectize(  
    "plot_type",  
    "Select Metric:",
    ["percentage", "count"],
    multiple=False,  
)


@render.plot
def plot():  
    df = pd.read_csv('kmers.csv')
    k = input.kmer()
    top_k = input.top_k()
    fig = None
    if input.plot_type() == "count":
        df = df[df['k'] == k]
        df = df.head(top_k)
        fig, ax = plt.subplots()
        ax.bar(df['kmer'], df['count'])
        ax.set_title(f"Most common {k}-mers")
        ax.set_xlabel("K-mer")
        ax.set_ylabel("Count")
        ax.set_xticklabels(df['kmer'], rotation=90)
    if input.plot_type() == "percentage":
        df = df[df['k'] == k]
        df = df.head(top_k)
        fig, ax = plt.subplots()
        ax.bar(df['kmer'], df['percent']*100)
        ax.set_title(f"Most common {k}-mers")
        ax.set_xlabel("K-mer")
        ax.set_ylabel("Percentage")
        ax.set_xticklabels(df['kmer'], rotation=90)
    return fig