import os
import streamlit as st
import pandas as pd
import huggingface_hub as hfh
import requests
import time
import uuid

def get_uuid():
    return str(uuid.uuid4())[:6]

os.makedirs("labels", exist_ok=True)

voters = [
    "osman",
    "eren",
    "robin",
    "mira",
    "bilal",
    "volunteer-1",
    "volunteer-2",
    "volunteer-3",
    "volunteer-4",
    "volunteer-5",
]

api = hfh.HfApi(token=os.environ.get("hf_token"))


def get_list_of_images():
    files = api.list_repo_tree(repo_id="aifred-smart-life-coach/capstone-images", repo_type="dataset", recursive=True,)
    files = [file.path for file in files if file.path.endswith((".png", ".jpg"))]
    return files


def get_one_from_queue(voter: str):
    # get an image for the voter or return False if no image is left
    # aifred-smart-life-coach/labels labels dataset
    # labels dataset multiple csv files named as [voter name].csv
    # each csv file has the image image path vote date, votes
    url = f"https://huggingface.co/datasets/aifred-smart-life-coach/labels/raw/main/{voter}.csv"

    # fetch file and save it to the labels folder
    file_path = f"labels/{voter}.csv"
    req = requests.get(url)
    with open(file_path, "wb") as file:
        file.write(req.content)

    df = pd.read_csv(file_path)
    print(df)
    num_past_votes = df.shape[0]
    print("num_past_votes", num_past_votes)
    list_of_images = get_list_of_images()
    print("list_of_images", len(list_of_images))
    st.write(f"You have voted for {num_past_votes} images out of {len(list_of_images)} images")

    # get the list of images that are not present in the csv file
    images_not_voted = list(set(list_of_images) - set(df["image_path"].tolist()))
    print("images_not_voted", len(images_not_voted))

    return images_not_voted[0] if images_not_voted else False


def update_vote(
    voter: str,
    image: str,
    gender: str,
    healthiness: int,
    fat_level: int,
    muscle_level: int,
    uuid_num: str,
):
    url = f"https://huggingface.co/datasets/aifred-smart-life-coach/labels/raw/main/{voter}.csv"

    # fetch file and save it to the labels folder
    file_path = f"labels/{voter}.csv"
    req = requests.get(url)
    # delete the file if it exists
    if os.path.exists(file_path):
        os.remove(file_path)
    with open(file_path, "wb") as file:
        file.write(req.content)

    df = pd.read_csv(file_path)
    print(df)

    # if the df has the image path of the image, raise an error
    if image in df["image_path"].tolist():
        st.error("You have already voted for this image")
        st.stop()

    new_row = pd.DataFrame(
        {
            "image_path": [image],
            "gender": [ gender ],
            "health": [healthiness],
            "fat_level": [fat_level],
            "muscle_level": [muscle_level],
            "vote_date": [int(time.time())],
            "voter_name": [voter],
            "uuid": [uuid_num],
        }
    )

    df = pd.concat([df, new_row], ignore_index=True)
    df.to_csv(file_path, index=False)

    # push the file to the dataset
    api.upload_file(
        path_or_fileobj=file_path,
        path_in_repo=f"{voter}.csv",
        repo_id="aifred-smart-life-coach/labels", repo_type="dataset",
        commit_message=f"{voter} voted for {image}"
    )




if 'loggedin' not in st.session_state: # user is not logged in
    with st.form("login"):
        username = st.selectbox("Select voter", voters)
        password = st.text_input("Password (get password from contact@osbm.dev)", type="password")
        submitted = st.form_submit_button("Login")

    if submitted: # submitted password
        if not password == os.environ.get("app_password"): # password is incorrect
            st.error("The password you entered is incorrect")
            st.stop()
        else: # password is correct
            st.success("Welcome, " + username)
            st.write("You are now logged in")
            st.session_state['loggedin'] = username
            st.rerun()

else: # logged in
    username = st.session_state['loggedin']
    st.success(f"Welcome, {username}")
    image_path = get_one_from_queue(username)

    with st.form("images", clear_on_submit=True):

        col1, col2= st.columns(2)
        with col1:
            if not image_path:
                st.write("You have voted for all the images")
                st.stop()

            path = hfh.hf_hub_download(
                repo_id="aifred-smart-life-coach/capstone-images",
                repo_type="dataset",
                filename=image_path,
                token=os.environ.get("hf_token")
            )
            st.image(path, width=300)

        with col2:
            st.write(image_path)
            gender = st.radio("Gender", [
                "Male",
                "Female",
                "Non-defining",
            ])
            healthiness = st.slider("How healthy is this picture?", 0, 100, 50)
            fat_level = st.slider("How fat is this picture?", 0, 100, 50)
            muscle_level = st.slider("How muscular is this picture?", 0, 100, 50)
            uuid_num = get_uuid()
            submitted_second = st.form_submit_button("Submit")

    if submitted_second:
        update_vote(
            voter=username,
            image=image_path,
            gender=gender,
            healthiness=healthiness,
            fat_level=fat_level,
            muscle_level=muscle_level,
            uuid_num=uuid_num,
        )
        st.success(f"Vote submitted uuid: {uuid_num} for the image: {image_path} (in case you want to undo the vote)")
        with st.spinner("Wait for the upload of the vote", show_time=True):
            time.sleep(1)
            st.rerun()