import os
from flask import Blueprint, render_template, request, redirect, url_for, flash
from supabase import create_client, Client
from dotenv import load_dotenv
import requests

# 환경 변수 로드
load_dotenv()

bp = Blueprint('mod_management', __name__, url_prefix='/mod-management')

# Supabase 클라이언트 초기화
SUPABASE_URL = os.getenv('SUPABASE_URL')
SUPABASE_KEY = os.getenv('SUPABASE_KEY')
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)

# Minecraft 서버 모드 디렉토리 경로
MODS_DIR = '/home/minecraft/server/mods'

@bp.route('/')
def mod_management():
    """모드 관리 페이지"""
    # 설치된 모드 목록 가져오기
    try:
        installed_mods = [
            {'id': idx, 'name': file}
            for idx, file in enumerate(os.listdir(MODS_DIR), start=1)
            if file.endswith('.jar')
        ]
    except FileNotFoundError:
        installed_mods = []
        flash("Mods directory not found. Please check your server setup.", "danger")

    # 요청된 모드 목록 가져오기
    try:
        mod_requests = supabase.table('mod_requests').select('*').eq('status', 'pending').execute().data
    except Exception as e:
        mod_requests = []
        flash(f"Failed to fetch mod requests: {e}", "danger")

    return render_template('mod_management.html', installed_mods=installed_mods, mod_requests=mod_requests)

@bp.route('/delete', methods=['POST'])
def delete_mod():
    """설치된 모드 삭제"""
    mod_name = request.form.get('mod_name')

    # 모드 파일 삭제
    try:
        file_path = os.path.join(MODS_DIR, mod_name)
        if os.path.exists(file_path):
            os.remove(file_path)
            flash(f"Mod '{mod_name}' deleted successfully.", "success")
        else:
            flash(f"Mod '{mod_name}' not found.", "danger")
    except Exception as e:
        flash(f"Failed to delete mod '{mod_name}': {e}", "danger")

    return redirect(url_for('mod_management.mod_management'))

@bp.route('/approve', methods=['POST'])
def approve_mod_request():
    """모드 요청 승인"""
    request_id = request.form.get('request_id')

    try:
        # 요청된 모드 정보 가져오기
        mod_request = supabase.table('mod_requests').select('*').eq('id', request_id).execute().data[0]
        file_path = mod_request['file_path']
        mod_name = mod_request['name']

        # Supabase Storage에서 파일 다운로드 (퍼블릭 URL)
        public_url = f"{SUPABASE_URL}/storage/v1/object/public/mods/{file_path}"
        response = requests.get(public_url)

        # 디버그 로그 출력
        print(f"Supabase download response: {response.status_code}, URL: {public_url}")

        if response.status_code == 200:
            # 서버 디렉토리에 파일 저장
            server_file_path = os.path.join(MODS_DIR, os.path.basename(file_path))
            with open(server_file_path, 'wb') as f:
                f.write(response.content)
            print(f"File saved to {server_file_path}")

            # 요청 상태 업데이트
            supabase.table('mod_requests').update({"status": "approved"}).eq('id', request_id).execute()

            flash(f"Mod '{mod_name}' approved and installed successfully at {server_file_path}.", "success")
        else:
            raise Exception(f"Failed to download mod file: HTTP {response.status_code}")
    except Exception as e:
        print(f"Error during mod approval: {e}")
        flash(f"Failed to approve mod request: {e}", "danger")

    return redirect(url_for('mod_management.mod_management'))



@bp.route('/reject', methods=['POST'])
def reject_mod_request():
    """모드 요청 거절"""
    request_id = request.form.get('request_id')

    try:
        # 요청 상태 업데이트
        supabase.table('mod_requests').update({"status": "rejected"}).eq('id', request_id).execute()
        flash("Mod request rejected successfully.", "success")
    except Exception as e:
        flash(f"Failed to reject mod request: {e}", "danger")

    return redirect(url_for('mod_management.mod_management'))
