import os
from subprocess import getoutput

# Welcome to the world of python madness!

# Debugging with Verbose mode on...
os.system(f'echo "Checking Python Version"')
os.system(f"python --version")

os.system(f'echo "Starting verbose diagnostic setup for stable-diffusion-webui..."')

# Clone repository
os.system(f'echo "Cloning Stable Diffusion WebUI repository from darkstorm2150..."')
os.system(f"git clone https://github.com/darkstorm2150/stable-diffusion-webui  /home/user/app/stable-diffusion-webui")

# Set working directory
os.system(f'echo "Setting working directory to stable-diffusion-webui root folder..."')
os.chdir("/home/user/app/stable-diffusion-webui")

# clean requirements.txt
#os.system(f'echo "Removing numpy and torch from requirements.txt to prevent version conflicts..."')
#os.system(f"sed -i '/numpy/d' /home/user/app/stable-diffusion-webui/requirements.txt")
#os.system(f"sed -i '/torch/d' /home/user/app/stable-diffusion-webui/requirements.txt")

# Patch environment
os.system(f'echo "Downloading environment patch script..."')
os.system(f"wget https://raw.githubusercontent.com/darkstorm2150/webui/refs/heads/main/env_patch.py  -O /home/user/app/env_patch.py")
os.system(f"sed -i -e '/import image_from_url_text/r /home/user/app/env_patch.py' /home/user/app/stable-diffusion-webui/modules/ui.py")

# UI customization
#os.system(f'echo "Removing Checkpoint Merger tab from UI..."')
#os.system(f"sed -i -e '/(modelmerger_interface, \"Checkpoint Merger\", \"modelmerger\"),/d' /home/user/app/stable-diffusion-webui/modules/ui.py")

#os.system(f'echo "Removing Training tab from UI..."')
#os.system(f"sed -i -e '/(train_interface, \"Train\", \"ti\"),/d' /home/user/app/stable-diffusion-webui/modules/ui.py")

#os.system(f'echo "Removing Extensions tab from UI..."')
#os.system(f"sed -i -e '/extensions_interface, \"Extensions\", \"extensions\"/d' /home/user/app/stable-diffusion-webui/modules/ui.py")

#os.system(f'echo "Removing Settings tab from UI..."')
#os.system(f"sed -i -e '/settings_interface, \"Settings\", \"settings\"/d' /home/user/app/stable-diffusion-webui/modules/ui.py")

# Gradio shadowRoot fix
os.system(f'echo "Fixing Gradio shadowRoot access in script.js for Hugging Face compatibility..."')
os.system(f'''sed -i -e "s/document.getElementsByTagName('gradio-app')\\[0\\].shadowRoot/!!document.getElementsByTagName('gradio-app')[0].shadowRoot ? document.getElementsByTagName('gradio-app')[0].shadowRoot : document/g" /home/user/app/stable-diffusion-webui/script.js''')

# Progress bar settings
os.system(f'echo "Enabling progress bars in UI for better user feedback..."')
os.system(f"sed -i -e 's/                show_progress=False,/                show_progress=True,/g' /home/user/app/stable-diffusion-webui/modules/ui.py")

# Queue settings
os.system(f'echo "Modifying webui.py to enable queuing for async processing..."')
os.system(f"sed -i -e 's/shared.demo.launch/shared.demo.queue().launch/g' /home/user/app/stable-diffusion-webui/webui.py")

os.system(f'echo "Disabling queuing for input components to reduce latency..."')
os.system(f"sed -i -e 's/inputs=\\[component\\],/&\\n                queue=False,/g' /home/user/app/stable-diffusion-webui/modules/ui.py")

os.system(f'echo "Disabling queuing for token counter outputs..."')
os.system(f"sed -i -e 's/outputs=\\[token_counter\\]/outputs=[token_counter], queue=False/g' /home/user/app/stable-diffusion-webui/modules/ui.py")



# ----------------------------Patch UI Header for Hugging Face Spaces----------------------------
os.system(f'echo "Downloading header_patch.py to customize UI header banners..."')
os.system(f"wget https://raw.githubusercontent.com/darkstorm2150/webui/refs/heads/main/header_patch.py  -O /home/user/app/header_patch.py")

os.system(f'echo "Injecting header_patch.py content into modules/ui.py under the demo section..."')
os.system(f"sed -i -e '/demo:/r /home/user/app/header_patch.py' /home/user/app/stable-diffusion-webui/modules/ui.py")
# ---------------------------------------------------------------------------------------------



# Handle shared vs. non-shared UI setup with verbose logging
if "IS_SHARED_UI" in os.environ:
    os.system(f'echo "IS_SHARED_UI IS ENABLED: Loading shared configurations..."')
    
    # Download shared UI configuration files
    os.system(f"echo 'Downloading shared-config.json for UI settings...'")
    os.system(f"wget https://raw.githubusercontent.com/darkstorm2150/webui/refs/heads/main/shared-config.json  -O /home/user/app/shared-config.json")
    
    os.system(f"echo 'Downloading shared-ui-config.json for layout preferences...'") 
    os.system(f"wget https://raw.githubusercontent.com/darkstorm2150/webui/refs/heads/main/shared-ui-config.json  -O /home/user/app/shared-ui-config.json")

    # Launch WebUI with shared settings
    os.system(f'echo "Starting WebUI with shared configurations..."')
    os.system(f"python launch.py --disable-console-progressbars --enable-console-prompts --ui-config-file /home/user/app/shared-ui-config.json --ui-settings-file /home/user/app/shared-config.json --cors-allow-origins huggingface.co,hf.space --no-progressbar-hiding")
else:
    os.system(f'echo "IS_SHARED_UI IS DISABLED: Setting up custom environment..."')
    
    # Download custom scripts
    os.system(f'echo "Installing run_n_times.py script for batch processing..."')
    os.system(f"wget https://raw.githubusercontent.com/darkstorm2150/webui/refs/heads/main/run_n_times.py  -O /home/user/app/stable-diffusion-webui/scripts/run_n_times.py")
    
    # Install extensions (commented lines can be activated by removing #)
    os.system(f'echo "Installing image browser extension for managing outputs..."')
    os.system(f"git clone https://github.com/yfszzx/stable-diffusion-webui-images-browser  /home/user/app/stable-diffusion-webui/extensions/stable-diffusion-webui-images-browser")
    
    os.system(f'echo "Installing Deforum animation extension..."')
    os.system(f"git clone https://github.com/deforum-art/deforum-for-automatic1111-webui  /home/user/app/stable-diffusion-webui/extensions/deforum-for-automatic1111-webui")
    
    # Load Protogen model (example custom model)
    os.system(f'echo "Downloading OpenGen v1.0 Stable Diffusion model..."')
    os.system(f"wget -q https://huggingface.co/darkstorm2150/OpenGen/resolve/main/OpenGen%20v1.0.safetensors  -O /home/user/app/stable-diffusion-webui/models/Stable-diffusion/OpenGen_v1.0.safetensors")
    
    # Critical dependency installation sequence
    #os.system(f'echo "starting dependency cleanup..."')
    #os.system(f'pip cache purge')

    # Running multiple times to remove stubborn copies
    #os.system(f'echo "Removing all existing numpy versions..."')
    #os.system(f'pip uninstall -y numpy numpy numpy')  
    
    # Force NumPy 1.26.4 first
    #os.system(f'echo "Installing NumPy 1.26.4..."')
    #os.system(f"pip install --no-cache-dir numpy==1.26.4")

    # Verify NumPy Version 1.26.4
    #os.system(f"python -c 'import numpy; print(numpy.__version__)'")

    # Install PyTorch + xformers with CUDA compatibility
    #os.system(f'echo "Installing PyTorch..."')
    #os.system(f"pip install torch==2.1.2+cu121 torchvision==0.16.2+cu121 --extra-index-url https://download.pytorch.org/whl/cu121 ")

    #os.system(f'echo "Installing xformers..."')
    #os.system(f"pip install --no-cache-dir xformers==0.0.25 --extra-index-url https://download.pytorch.org/whl/cu118")

    os.system(f'echo "Installing build dependencies..."')
    os.system(f'pip install ninja packaging wheel')
    os.system(f'apt-get update && apt-get install -y build-essential cmake git')
    
    # Building xformers from source
    os.system(f'echo "Cloning xformers repo..."')
    os.system(f'git clone https://github.com/facebookresearch/xformers.git  /home/user/app/xformers')
    os.system("cd /home/user/app/xformers && git submodule update --init --recursive")

    # Change directory to xformers and install
    os.chdir('/home/user/app/xformers')
    os.system('pip install --no-cache-dir -e .')

    # Final verification
    os.system(f'echo "Verifying NumPy and PyTorch..."')
    
    os.system("python -c 'import numpy; print(\"NumPy:\", numpy.__version__)'")
    os.system("python -c 'import torch; print(\"PyTorch:\", torch.__version__)'")

    # Explicitly verify xformers import
    os.system("python -c 'import xformers; print(\"xformers version:\", xformers.__version__)'")
    
    # Launch WebUI with custom settings
    os.system(f'echo "Starting WebUI..."')

    # reinstalling libraries
    os.system(f'pip uninstall -y torch torchvision xformers')
    os.system(f'pip install torch==2.7.1+cu126 torchvision==0.18.1+cu126 --extra-index-url https://download.pytorch.org/whl/cu126')
    os.system(f'pip install xformers==0.0.32+0f0bb9d9.d20250720 --extra-index-url https://download.pytorch.org/whl/cu126')

    os.system(f'pip install -U ninja cmake pybind11')

    # starting xformers with WebUI...
    os.chdir('/home/user/app/stable-diffusion-webui')
    os.system("python launch.py --ui-config-file /home/user/app/shared-ui-config.json --ui-settings-file /home/user/app/shared-config.json --disable-console-progressbars --enable-console-prompts --cors-allow-origins huggingface.co,hf.space --no-progressbar-hiding --api --skip-torch-cuda-test")