import os
import shutil
import time
from flask import Flask, render_template_string, send_from_directory
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import threading

app = Flask(__name__)

UPLOAD_FOLDER = "uploads"
WATCH_FOLDER = "watch_folder"

os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(WATCH_FOLDER, exist_ok=True)

# ✅ Check file fully written
def is_file_ready(path):
    try:
        size1 = os.path.getsize(path)
        time.sleep(1)
        size2 = os.path.getsize(path)
        return size1 == size2
    except:
        return False

# 🔁 Watcher class
class WatcherHandler(FileSystemEventHandler):
    def on_created(self, event):
        if not event.is_directory:
            file_path = event.src_path
            file_name = os.path.basename(file_path)

            # 🕒 Rename to avoid overwrite
            timestamp = int(time.time())
            name, ext = os.path.splitext(file_name)
            new_name = f"{name}_{timestamp}{ext}"

            dest_path = os.path.join(UPLOAD_FOLDER, new_name)

            # 🔁 Retry until file ready
            for i in range(10):
                try:
                    if is_file_ready(file_path):
                        shutil.copy(file_path, dest_path)
                        print(f"✅ Auto Uploaded: {new_name}")
                        break
                    else:
                        print(f"⏳ File not ready: {file_name}")
                except PermissionError:
                    print(f"🔒 Waiting (locked): {file_name}")
                except Exception as e:
                    print(f"❌ Error: {e}")
                    break

                time.sleep(1)

# 🚀 Start watcher
def start_watcher():
    event_handler = WatcherHandler()
    observer = Observer()
    observer.schedule(event_handler, WATCH_FOLDER, recursive=False)
    observer.start()
    print("👀 Watching folder...")


# 📸 Gallery (Auto latest first)
@app.route("/")
def gallery():
    images = os.listdir(UPLOAD_FOLDER)
    images.sort(reverse=True)

    html = """
    <h1>📸 Live Gallery</h1>
    {% for img in images %}
        <div>
            <img src="/uploads/{{img}}" width="300"><br>
            {{img}}
        </div>
        <hr>
    {% endfor %}
    """
    return render_template_string(html, images=images)

# 📂 Serve images
@app.route("/uploads/<filename>")
def uploaded_file(filename):
    return send_from_directory(UPLOAD_FOLDER, filename)

# ▶️ Run app + watcher
if __name__ == "__main__":
    threading.Thread(target=start_watcher, daemon=True).start()
    app.run(debug=True)