import gradio as gr
import pandas as pd 
import requests
import json
from datasets import load_dataset
from PIL import Image
#dataset = load_dataset("nlphuji/flickr30k", split="test[10:20]")
#print (dataset)

#headers = {"Authorization": f"Bearer {API_TOKEN}"}
def query1(fetch_url):
    if fetch_url=="":
        fetch_url = "nlphuji/flickr30k"    
    API_URL1 = f"https://datasets-server.huggingface.co/splits?dataset={fetch_url}"
    response = requests.get(API_URL1)
    json_obj=response.json()

    config_box = []
    split_box = []
    for obj in json_obj:
        print (obj)
        if obj == "splits":
            try:
                for split in json_obj[obj]:
                    print (f'split: {split}')
                    out_config = split['config']
                    out_split = split['split']
                    print (out_config)
                    print (out_split)
                    config_box.append(out_config)
                    split_box.append(out_split)
            except Exception as e:
                print (e)
                pass 
    #df = pd.DataFrame.from_dict(json_obj)        
    return json_obj,gr.update(choices=[c for c in config_box]),gr.update(choices=[s for s in split_box])


def query2(fetch_url,config="TEST",split="test",offset=0,length=10):
    if fetch_url=="":
        fetch_url = "nlphuji/flickr30k"
    #offset=0
    #length=10
    API_URL2 = f"https://datasets-server.huggingface.co/rows?dataset={fetch_url}&config={config}&split={split}&offset={offset}&length={length}"
    response = requests.get(API_URL2)
    dictionary=response.json()
    #print (len(dictionary))
    lvl_1=[]
    
    for key in dictionary:
        lvl_1.append(key)
        print (key)
    return dictionary,gr.update(choices=[l for l in lvl_1])

def find_fn(lvl_1,lvl_2,fetch_url,config="TEST",split="test",offset=0,length=10):
    #print(out_json['rows'])
    #print (inp)
    img_list=[]
    out_json,_=query2(fetch_url,config,split,offset=10,length=20)
    lvl_1=lvl_1.strip("[]")

    lvl_2=lvl_2.strip('""').strip("''")
    #print(inp)
    cnt_lvl = ""
    if lvl_2 != "":
        ea_lvl_len = len(lvl_2)
        print (ea_lvl_len)
        for ea_lvl in lvl_2:
            cnt_lvl = f'{cnt_lvl}[{ea_lvl}]'
        for ea in out_json[f"{lvl_1}"]:
            cnt_lvl=cnt_lvl.strip("[]")
            #img_ea = ea['row']['image']['src']
            img_list.append(ea[f"{cnt_lvl}"])
    if lvl_2 == "":
        img_list.append(out_json[lvl_1])
    return img_list
def upd_drop(lvl_1=None,lvl_2=None,lvl_3=None,lvl_4=None,lvl_5=None,fetch_url="",config="TEST",split="test",offset=0,length=10):
    out_json,_=query2(fetch_url,config,split,offset=10,length=20)
    box_1=[]
    box_2=[]
    box_3=[]
    box_4=[]
    box_5=[]
    out1=None 
    out2=None 
    out3=None 
    out4=None
    print (f'lvl_1 ::: {lvl_1}')
    print (f'lvl_2 ::: {lvl_2}')
    print (f'lvl_3 ::: {lvl_3}')
    print (f'lvl_4 ::: {lvl_4}')
    print (f'lvl_5 ::: {lvl_5}')
    out=[]
    if lvl_1 == "rows":
        lvl_src= out_json[lvl_1][0]
    else:
        lvl_src=out_json[lvl_1]
    print (f"lvl_src:: {lvl_src}")
    try:    
        if lvl_1 !=[]:
            for ea in (lvl_src):
                box_1.append(ea)    
            out= gr.update(choices = [m for m in box_1])
    except Exception:
        pass
    try:    
        if lvl_2 !=[]:
            for ea in (lvl_src[lvl_2]):
                print (ea)
                box_2.append(ea)    
            out= gr.update(choices = [m for m in box_2])
        else:
            pass
    except Exception:
        pass
    try:    
        if lvl_3 !=[]:
            for ea in (lvl_src[lvl_2][lvl_3]):
                box_3.append(ea)    
            out= gr.update(choices = [m for m in box_3])
        else:
            pass
    except Exception:
        pass
    try:    
        if lvl_4 !=[]:
            for ea in (lvl_src[lvl_2][lvl_3][lvl_4]):
                box_4.append(ea)    
            out= gr.update(choices = [m for m in box_4])  
        else:
            pass
    except Exception:
        pass
    return out
def find_items(lvl_1,lvl_2,lvl_3,lvl_4,lvl_5,fetch_url,config="TEST",split="test",offset=0,length=10):
    out_json,_=query2(fetch_url,config,split,offset=10,length=20)
    box_1=[]
    box_2=[]
    box_3=[]
    box_4=[]
    box_5=[]
    print (f'lvl_1 ::: {lvl_1}')
    print (f'lvl_2 ::: {lvl_2}')
    print (f'lvl_3 ::: {lvl_3}')
    print (f'lvl_4 ::: {lvl_4}')
    print (f'lvl_5 ::: {lvl_5}')    
    if lvl_1 !=[] and lvl_1!=None:
        for ea in (out_json[lvl_1]):
            box_1.append(ea)    
        out = box_1
    if lvl_2 !=[] and lvl_2!=None:
        for ea in (out_json[lvl_1]):
            box_2.append(ea[lvl_2])    
        out = box_2
    if lvl_3 !=[] and lvl_3!=None:
        for ea in (out_json[lvl_1]):
            box_3.append(ea[lvl_2][lvl_3])    
        out = box_3  
    if lvl_4 !=[] and lvl_4!=None:
        for ea in (out_json[lvl_1]):
            box_4.append(ea[lvl_2][lvl_3][lvl_4])    
        out = box_4  
    if lvl_5 !=[] and lvl_5!=None:
        for ea in (out_json[lvl_1]):
            box_5.append(ea[lvl_2][lvl_3][lvl_4][lvl_5])    
        out = box_5          
    return out
def img_fn(inp):
    img_box=[]
    for img in inp:
        #out = Image.open(inp)
        img_box.append(img)
    return img_box
with gr.Blocks(theme="Nymbo/Nymbo_Theme") as app:
    with gr.Box():
        with gr.Row():
            with gr.Column(scale=3):
                with gr.Row():
                    data_set_url=gr.Textbox(label="Dataset (repo/name)")
                    fetch_btn=gr.Button()
                with gr.Row():
                    config_set=gr.Dropdown(label="Config")
                    split_set=gr.Dropdown(label="Split")
                    #config_drop = gr.Dropdown(label="Config/Split", choices=[])
                    view_data=gr.Button(label="View")
                with gr.Row():
                    lvl_1=gr.Dropdown(label="lvl_1")
                    lvl_2=gr.Dropdown(label="lvl_2")
                    lvl_3=gr.Dropdown(label="lvl_3")
                    lvl_4=gr.Dropdown(label="lvl_4")
                    lvl_5=gr.Dropdown(label="lvl_5")
                    
                    find_btn=gr.Button("Search")
                with gr.Tab("JSON"):
                    out_find = gr.JSON()
                with gr.Tab("Gallery"):
                    gal_btn=gr.Button("Load Images")
                    out_gal = gr.Gallery(columns=8)

            with gr.Column(scale=1):
                out_json = gr.JSON()

    lvl_1.change(upd_drop,[lvl_1,lvl_2,lvl_3,lvl_4,lvl_5,data_set_url,config_set,split_set],[lvl_2])
    lvl_2.change(upd_drop,[lvl_1,lvl_2,lvl_3,lvl_4,lvl_5,data_set_url,config_set,split_set],[lvl_3])
    lvl_3.change(upd_drop,[lvl_1,lvl_2,lvl_3,lvl_4,lvl_5,data_set_url,config_set,split_set],[lvl_4])
    lvl_4.change(upd_drop,[lvl_1,lvl_2,lvl_3,lvl_4,lvl_5,data_set_url,config_set,split_set],[lvl_5])

    
    find_btn.click(find_items,[lvl_1,lvl_2,lvl_3,lvl_4,lvl_5,data_set_url,config_set,split_set],out_find)
    view_data.click(query2,[data_set_url,config_set,split_set],[out_find,lvl_1])
    gal_btn.click(img_fn,out_find,out_gal)
    
    
    #find_btn.click(find_fn,[lvl_1,lvl_2,data_set_url,config_set,split_set],[out_find])
    fetch_btn.click(query1,data_set_url,[out_json,config_set,split_set])
app.launch()