import argparse
import glob
import os.path

import gradio as gr

import pickle
import tqdm
import json

import TMIDIX
from midi_to_colab_audio import midi_to_colab_audio

import copy
from collections import Counter
import random
import statistics

import matplotlib.pyplot as plt

#==========================================================================================================

in_space = os.getenv("SYSTEM") == "spaces"

#==========================================================================================================

def find_midi(search_string, search_options):
  
    print('=' * 70)
    print('Preparing to search...')
    
    #==================================================
    
    
    random.shuffle(AUX_DATA)
    
    search_data = []
    
    for A in AUX_DATA:
        data = ''
        if 'Titles' in search_options:
            data += A[1] + '\n\n'
        if 'Lyrics' in search_options:
            data += A[2] + '\n\n'
        if 'Summaries' in search_options:
            data += A[3] + '\n\n'

        search_data.append(data)
    
    print('Searching titles...Please wait...')
    
    search_match_data = TMIDIX.ascii_texts_search(search_data, search_string)
    search_match_text = search_match_data[0]
    search_match_ratio = search_match_data[1]
    search_match_index = search_data.index(search_match_text)
    
    print('Done!')
    print('=' * 70)
    print('Selected file/title:', AUX_DATA[search_match_index][:2])
    print('=' * 70)

    fn = AUX_DATA[search_match_index][0]
    raw_score = AUX_DATA[search_match_index][4]
    single_track_score_notes = TMIDIX.advanced_score_processor(raw_score, 
                                                               return_score_analysis=False, 
                                                               return_enhanced_score_notes=True)[0]

    print('Sample INTs', raw_score[1][:5])
    print('=' * 70)
 
    x = []
    y = []
    c = []
    
    colors = ['red', 'yellow', 'green', 'cyan',
            'blue', 'pink', 'orange', 'purple',
            'gray', 'white', 'gold', 'silver',
            'lightgreen', 'indigo', 'maroon', 'turquoise']
    
    for s in single_track_score_notes:
        x.append(s[1])
        y.append(s[4])
        c.append(colors[s[3]])

    plt.close()
    plt.figure(figsize=(14,5))
    ax=plt.axes(title='MIDI Match Plot')
    ax.set_facecolor('black')
    
    plt.scatter(x,y, s=0.1, c=c)
    plt.xlabel("Time in MIDI ticks")
    plt.ylabel("MIDI Pitch")

    with open(fn+'.mid', 'wb') as f:
        f.write(TMIDIX.score2midi(raw_score))
    audio = midi_to_colab_audio(fn+'.mid', 
                        soundfont_path=soundfont_path, 
                        sample_rate=16000, # 44100
                        volume_scale=10,
                        output_for_gradio=True
                        )
    yield AUX_DATA[search_match_index][0], fn+'.mid', (16000, audio), plt

#==========================================================================================================

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--share", action="store_true", default=False, help="share gradio app")
    parser.add_argument("--port", type=int, default=7860, help="gradio server port")
    parser.add_argument("--max-gen", type=int, default=1024, help="max")
    
    opt = parser.parse_args()
    
    soundfont_path = "SGM-v2.01-YamahaGrand-Guit-Bass-v2.7.sf2"
    meta_data_path = "English_Karaoke_Files_Titles_Lyrics_Summaries_Scores_Final.pickle"

    print('Loading meta-data...')
    with open(meta_data_path, 'rb') as f:
        AUX_DATA = pickle.load(f)
    print('Done!')
    
    app = gr.Blocks()
    with app:
        gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Karaoke MIDI Search</h1>")
        gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Search and explore 5865 select Karaoke MIDI titles</h1>")
        
        gr.Markdown("![Visitors](https://api.visitorbadge.io/api/visitors?path=asigalov61.Karaoke-MIDI-Search&style=flat)\n\n"
                    "Los Angeles MIDI Dataset Demo\n\n"
                    "Please see [Los Angeles MIDI Dataset](https://github.com/asigalov61/Los-Angeles-MIDI-Dataset) for more information and features\n\n"
                    "[Open In Colab]"
                    "(https://colab.research.google.com/github/asigalov61/Los-Angeles-MIDI-Dataset/blob/main/Los_Angeles_MIDI_Dataset_Search_and_Explore.ipynb)"
                    " for all features"
                    )
        
        search_string = gr.Textbox(label="Enter search prompt here", value="And Nothing Else Matters")
        search_options = gr.CheckboxGroup(["Titles", "Lyrics", "Summaries"], value="Lyrics", label="Search within", info="Where to search?")
        submit = gr.Button()

        gr.Markdown("# Search results")

        output_midi_seq = gr.Textbox(label="Found MIDI search title")
        output_audio = gr.Audio(label="Output MIDI search sample audio", format="mp3", elem_id="midi_audio")
        output_plot = gr.Plot(label="Output MIDI search sample plot")
        output_midi = gr.File(label="Output MIDI search sample MIDI", file_types=[".mid"])
        
        run_event = submit.click(find_midi, [search_string, search_options],
                                                  [output_midi_seq, output_midi, output_audio, output_plot])
        
    app.queue(1).launch(server_port=opt.port, share=opt.share, inbrowser=True)