import gradio as gr
from huggingface_hub import HfApi, create_repo, upload_file
import os

# Global variable for storing the token (persistent while app runs)
hf_token = None

def save_token(token):
    global hf_token
    hf_token = token.strip()
    return f"Token saved! You can now manage your Spaces."

def manage_space(space_name, app_code, req_code):
    global hf_token
    if not hf_token:
        return "Please provide a valid Hugging Face token first."

    if not space_name.strip():
        return "Error: Space name is required."
    if not app_code.strip() or not req_code.strip():
        return "Error: Both `app.py` and `requirements.txt` code are required."

    api = HfApi()
    try:
        # Authenticate using the token
        user_info = api.whoami(token=hf_token)
        space_full_name = f"{user_info['name']}/{space_name.strip()}"

        # Check if Space exists or create a new one
        try:
            api.repo_info(repo_id=space_full_name, repo_type="space", token=hf_token)
            message = f"Space '{space_full_name}' exists. Updating files..."
        except:
            create_repo(repo_id=space_name.strip(), repo_type="space", space_sdk="streamlit", token=hf_token)
            message = f"Space '{space_full_name}' did not exist. Created a new Space."

        # Upload `app.py`
        with open("app.py", "w") as app_file:
            app_file.write(app_code.strip())
        upload_file(
            path_or_fileobj="app.py",
            path_in_repo="app.py",
            repo_id=space_full_name,
            repo_type="space",
            token=hf_token
        )

        # Upload `requirements.txt`
        with open("requirements.txt", "w") as req_file:
            req_file.write(req_code.strip())
        upload_file(
            path_or_fileobj="requirements.txt",
            path_in_repo="requirements.txt",
            repo_id=space_full_name,
            repo_type="space",
            token=hf_token
        )

        # Clean up temporary files
        os.remove("app.py")
        os.remove("requirements.txt")

        return f"{message}\nFiles successfully updated in Space '{space_full_name}'!"

    except Exception as e:
        return f"An error occurred: {e}"

# Gradio interface
token_input = gr.Textbox(label="Hugging Face Token", type="password", placeholder="Enter your token here")
save_token_button = gr.Button("Save Token")

space_name_input = gr.Textbox(label="Space Name", placeholder="Enter the name of your Space")
app_code_input = gr.Textbox(label="app.py Code", lines=15, placeholder="Paste your app.py code here")
req_code_input = gr.Textbox(label="requirements.txt Code", lines=5, placeholder="Paste your requirements.txt content here")
manage_button = gr.Button("Commit Changes")
output = gr.Textbox(label="Output", lines=5)

save_token_interface = gr.Interface(fn=save_token, inputs=token_input, outputs=output)
manage_space_interface = gr.Interface(
    fn=manage_space,
    inputs=[space_name_input, app_code_input, req_code_input],
    outputs=output
)

app = gr.Blocks()

with app:
    with gr.Row():  # Row instead of Box for layout
        gr.Markdown("# Hugging Face Helper")
    with gr.Column():  # Use Column for vertical alignment
        gr.Markdown("### Step 1: Save Your Hugging Face Token")
        token_input.render()
        save_token_button.render()
        save_token_interface.render()

    with gr.Column():  # Use Column for vertical alignment
        gr.Markdown("### Step 2: Manage Your Hugging Face Space")
        space_name_input.render()
        app_code_input.render()
        req_code_input.render()
        manage_button.render()
        manage_space_interface.render()

# Launch the Gradio app
app.launch()