import os
import json
import signal
import subprocess
from flask import Flask, render_template, request, jsonify, redirect, url_for

app = Flask(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
BOTS_DIR = os.path.join(BASE_DIR, "bots")
DATA_FILE = os.path.join(BASE_DIR, "bots_data.json")
VENV_PYTHON = os.path.join(BASE_DIR, "venv/bin/python")

if not os.path.exists(DATA_FILE):
    with open(DATA_FILE, "w") as f:
        json.dump({}, f)

def load_data():
    with open(DATA_FILE, "r") as f:
        return json.load(f)

def save_data(data):
    with open(DATA_FILE, "w") as f:
        json.dump(data, f, indent=4)

def is_pid_running(pid):
    if not pid:
        return False
    try:
        os.kill(int(pid), 0)
        return True
    except OSError:
        return False

@app.route('/')
def dashboard():
    bots = load_data()
    # লাইভ স্ট্যাটাস আপডেট চেক
    for bot_id, info in bots.items():
        info['is_running'] = is_pid_running(info.get('pid'))
    save_data(bots)
    return render_template('dashboard.html', bots=bots)

@app.route('/create_bot', methods=['POST'])
def create_bot():
    bot_name = request.form.get('bot_name').strip().replace(" ", "_")
    bot_token = request.form.get('bot_token').strip()
    file = request.files.get('bot_file')

    if not bot_name or not file:
        return "বটের নাম এবং ফাইল দেওয়া বাধ্যতামূলক!", 400

    bot_folder = os.path.join(BOTS_DIR, bot_name)
    os.makedirs(bot_folder, exist_ok=True)
    
    script_path = os.path.join(bot_folder, file.filename)
    file.save(script_path)

    bots = load_data()
    bots[bot_name] = {
        "name": bot_name,
        "token": bot_token,
        "script": script_path,
        "folder": bot_folder,
        "pid": None,
        "log_file": os.path.join(bot_folder, "activity.log")
    }
    save_data(bots)
    return redirect(url_for('dashboard'))

@app.route('/action/<bot_name>/<action>')
def bot_action(bot_name, action):
    bots = load_data()
    if bot_name not in bots:
        return jsonify({"error": "Bot not found"}), 404

    bot = bots[bot_name]
    pid = bot.get('pid')

    if action == "start":
        if is_pid_running(pid):
            return redirect(url_for('dashboard'))

        env = os.environ.copy()
        if bot.get('token'):
            env["BOT_TOKEN"] = bot['token']

        log_file = open(bot['log_file'], "a")
        proc = subprocess.Popen(
            [VENV_PYTHON, bot['script']],
            cwd=bot['folder'],
            stdout=log_file,
            stderr=subprocess.STDOUT,
            env=env
        )
        bot['pid'] = proc.pid

    elif action == "stop":
        if is_pid_running(pid):
            try:
                os.kill(int(pid), signal.SIGTERM)
            except Exception:
                pass
        bot['pid'] = None

    elif action == "delete":
        if is_pid_running(pid):
            try:
                os.kill(int(pid), signal.SIGKILL)
            except Exception:
                pass
        del bots[bot_name]
        save_data(bots)
        return redirect(url_for('dashboard'))

    save_data(bots)
    return redirect(url_for('dashboard'))

@app.route('/logs/<bot_name>')
def get_logs(bot_name):
    bots = load_data()
    if bot_name in bots and os.path.exists(bots[bot_name]['log_file']):
        with open(bots[bot_name]['log_file'], 'r', errors='ignore') as f:
            lines = f.readlines()
            return "".join(lines[-40:])
    return "কোনো লগ হিস্ট্রি পাওয়া যায়নি।"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)