import os
import subprocess
from flask import Blueprint, render_template, request, redirect, url_for, flash

bp = Blueprint('players', __name__, url_prefix='/players')

# RCON 정보
RCON_HOST = "127.0.0.1"
RCON_PORT = "25575"
RCON_PASSWORD = "init1234!"

import re

def run_rcon_command(command):
    """RCON 명령 실행"""
    try:
        mcrcon_path = "/usr/local/bin/mcrcon"  # 절대 경로 사용
        full_command = f'{mcrcon_path} -H {RCON_HOST} -P {RCON_PORT} -p {RCON_PASSWORD} {command}'
        print(f"Executing RCON command: {full_command}")  # 디버깅 로그 추가
        result = subprocess.check_output(full_command, shell=True, stderr=subprocess.STDOUT).decode('utf-8')
        
        # ANSI 이스케이프 코드 제거
        result_cleaned = re.sub(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])', '', result)
        print(f"RCON response: {result_cleaned}")  # RCON 명령 결과 로그
        return result_cleaned.strip()
    except subprocess.CalledProcessError as e:
        error_message = e.output.decode('utf-8') if e.output else str(e)
        print(f"RCON command failed: {error_message}")  # 디버깅용 오류 로그
        raise Exception(f"Failed to execute RCON command: {error_message}")




@bp.route('/')
def players():
    """플레이어 목록 조회"""
    try:
        # RCON 명령 실행
        result = run_rcon_command("list")

        # 접속한 플레이어 목록 파싱
        online_players = []
        if "players online:" in result:
            _, players_list = result.split(": ", 1)
            online_players = [player.strip() for player in players_list.split(",") if player.strip()]

        # 플레이어 상태 생성
        players = [
            {'name': player, 'status': 'Online'}
            for player in online_players
        ]
    except Exception as e:
        flash(f"Failed to fetch player data: {e}", "danger")
        players = []

    return render_template('players.html', players=players)

@bp.route('/op', methods=['POST'])
def op_player():
    """플레이어 OP 설정"""
    player_name = request.form.get('player_name')
    try:
        result = run_rcon_command(f"op {player_name}")
        flash(f"RCON Response: {result}", "success")
    except Exception as e:
        flash(f"Failed to grant OP to '{player_name}': {e}", "danger")

    return redirect(url_for('players.players'))


@bp.route('/deop', methods=['POST'])
def deop_player():
    """플레이어 OP 해제"""
    player_name = request.form.get('player_name')
    try:
        run_rcon_command(f"deop {player_name}")
        flash(f"Player '{player_name}' has been removed from OP permissions.", "success")
    except Exception as e:
        flash(f"Failed to remove OP from '{player_name}': {e}", "danger")

    return redirect(url_for('players.players'))

@bp.route('/ban', methods=['POST'])
def ban_player():
    """플레이어 BAN"""
    player_name = request.form.get('player_name')
    try:
        run_rcon_command(f"ban {player_name}")
        flash(f"Player '{player_name}' has been banned from the server.", "success")
    except Exception as e:
        flash(f"Failed to ban '{player_name}': {e}", "danger")

    return redirect(url_for('players.players'))

@bp.route('/kick', methods=['POST'])
def kick_player():
    """플레이어 KICK"""
    player_name = request.form.get('player_name')
    try:
        run_rcon_command(f"kick {player_name}")
        flash(f"Player '{player_name}' has been kicked from the server.", "success")
    except Exception as e:
        flash(f"Failed to kick '{player_name}': {e}", "danger")

    return redirect(url_for('players.players'))
