from flask import Blueprint, request, jsonify, send_from_directory, render_template, redirect, Response
from urllib.parse import urlparse, urljoin, quote, urlsplit, parse_qs
import os, time, requests
from bs4 import BeautifulSoup

proxy_bp = Blueprint('proxy', __name__)
RENDER_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../rendered"))
os.makedirs(RENDER_DIR, exist_ok=True)
CACHE_EXPIRE_SECONDS = 1800

@proxy_bp.route("/")
def index():
    return render_template("viewer.html")

def build_filename(url):
    parsed = urlsplit(url)
    domain = parsed.netloc.replace(".", "_")
    path = parsed.path.strip("/").replace("/", "_")
    query = parse_qs(parsed.query)
    query_str = "&".join(f"{k}={','.join(v)}" for k, v in query.items())
    safe_query = query_str.replace("&", "_").replace("=", "-").replace(",", "-")
    return f"{domain}_{path}_{safe_query or 'index'}.html"

def cleanup_old_cache():
    now = time.time()
    for filename in os.listdir(RENDER_DIR):
        path = os.path.join(RENDER_DIR, filename)
        if os.path.isfile(path) and now - os.path.getmtime(path) > CACHE_EXPIRE_SECONDS:
            os.remove(path)

@proxy_bp.route("/fetch")
def fetch():
    cleanup_old_cache()
    url = request.args.get("url")
    skip_images = request.args.get("noimg") == "1"

    if not url:
        return "URL이 제공되지 않았습니다.", 400
    if not url.startswith("http"):
        url = "https://" + url

    try:
        headers = {"User-Agent": "Mozilla/5.0"}
        res = requests.get(url, headers=headers, timeout=10)
        res.raise_for_status()
        soup = BeautifulSoup(res.text, "html.parser")

        parsed_url = urlparse(url)
        base_url = f"{parsed_url.scheme}://{parsed_url.netloc}"

        for tag in soup.find_all(["a", "link", "script", "img", "source"]):
            attr = "href" if tag.name in ["a", "link"] else "src"
            if tag.has_attr(attr):
                original = tag[attr]
                absolute = urljoin(base_url, original)
                if tag.name == "a":
                    if original.startswith("javascript:") or original.startswith("#"):
                        continue
                    tag[attr] = f"/fetch?url={quote(absolute)}&noimg={'1' if skip_images else '0'}"
                elif tag.name in ["link", "script"]:
                    tag[attr] = f"/fetch_proxy?url={quote(absolute)}"
                elif tag.name in ["img", "source"]:
                    if skip_images:
                        tag.decompose()
                    else:
                        tag[attr] = f"/fetch_proxy?url={quote(absolute)}"

        filename = build_filename(url)
        with open(os.path.join(RENDER_DIR, filename), "w", encoding="utf-8") as f:
            f.write(str(soup))

        return jsonify({
            "rendered_path": f"/rendered/{filename}",
            "current_url": url
        })

    except Exception as e:
        return jsonify({"error": str(e)}), 500

@proxy_bp.route("/fetch_proxy")
def fetch_proxy():
    url = request.args.get("url")
    if not url:
        return "URL 없음", 400
    try:
        headers = {"User-Agent": "Mozilla/5.0"}
        res = requests.get(url, headers=headers, timeout=10)
        res.raise_for_status()
        return Response(res.content, content_type=res.headers.get("Content-Type", "application/octet-stream"))
    except Exception as e:
        return f"프록시 오류: {e}", 500

@proxy_bp.route("/rendered/<path:filename>")
def serve_rendered(filename):
    return send_from_directory(RENDER_DIR, filename)
