from flask import Flask, jsonify, render_template_string, request, redirect, session
import os
import subprocess
import psutil
from datetime import datetime
import socket

app = Flask(__name__)
app.secret_key = "lastcharter-control-center-v2"

BASE="/home/lastchar"
BOT_DIR=f"{BASE}/lastcharter_v14_0_1"
MONITOR=f"{BASE}/monitoring"

PASSWORD="lastchar123"


def check_bot():
    pidfile=f"{BOT_DIR}/bot.pid"
    if os.path.exists(pidfile):
        pid=open(pidfile).read().strip()
        if pid.isdigit() and psutil.pid_exists(int(pid)):
            return f"OK ({pid})"
    return "DOWN"


def check_contact():
    try:
        out=subprocess.check_output(
            "pgrep -f 'contact_center_api_clean/passenger_wsgi.py'",
            shell=True
        )
        if out:
            return "OK"
    except:
        pass
    return "DOWN"


def check_v17():
    try:
        subprocess.check_output(
            "curl -sf --max-time 3 http://127.0.0.1:8787/health",
            shell=True
        )
        return "OK"
    except:
        return "DOWN"


def system_info():
    return {
        "cpu": psutil.cpu_percent(),
        "ram": psutil.virtual_memory().percent,
        "disk": psutil.disk_usage("/home/lastchar").percent,
        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }


def services():
    return {
        "🤖 Telegram Bot": check_bot(),
        "☎️ Contact Center": check_contact(),
        "🌐 V17 Engine": check_v17()
    }


@app.route("/login", methods=["GET","POST"])
def login():
    if request.method=="POST":
        if request.form.get("password")==PASSWORD:
            session["login"]=True
            return redirect("/")
    return """
    <div style="background:#111827;color:white;height:100vh;padding:50px;font-family:tahoma">
    <h2>🚀 Lastcharter Control Center</h2>
    <form method="post">
    <input name="password" type="password" placeholder="Password"
    style="padding:12px;border-radius:8px">
    <button style="padding:12px">Login</button>
    </form>
    </div>
    """


@app.route("/")
def index():
    if not session.get("login"):
        return redirect("/login")

    return render_template_string("""
<!doctype html>
<html dir="rtl">
<head>
<meta charset="utf-8">
<title>Lastcharter Control Center</title>

<style>
body{
background:#0f172a;
color:white;
font-family:tahoma;
padding:30px;
}

.card{
background:#1e293b;
border-radius:18px;
padding:20px;
margin:10px;
display:inline-block;
min-width:230px;
box-shadow:0 5px 20px #0005;
}

.ok{color:#22c55e;font-size:22px}
.warn{color:#f59e0b}

button{
padding:12px;
border-radius:10px;
cursor:pointer;
margin:5px;
}

</style>
</head>

<body>

<h1>🚀 Lastcharter Control Center V2</h1>

<div id="services"></div>

<h2>📊 System</h2>
<div id="system"></div>

<h2>🛠 مدیریت</h2>

<button onclick="action('/restart_bot')">
Restart Bot
</button>

<button onclick="action('/backup')">
Backup Now
</button>

<button onclick="action('/health')">
Health Check
</button>


<h2>📜 Logs</h2>

<pre id="logs"
style="background:#020617;padding:20px;border-radius:15px">
</pre>


<script>

async function load(){

let r=await fetch('/api/status');
let d=await r.json();


let s="";

for(let x in d.services){

s+=`
<div class="card">
<h3>${x}</h3>
<div class="ok">${d.services[x]}</div>
</div>
`;

}

document.getElementById("services").innerHTML=s;


let sys="";

for(let x in d.system){

sys+=`
<div class="card">
<h3>${x}</h3>
<div>${d.system[x]}</div>
</div>
`;

}

document.getElementById("system").innerHTML=sys;


document.getElementById("logs").innerText=d.log;

}


async function action(url){

await fetch(url);
alert("Done");

}


load();
setInterval(load,10000);

</script>

</body>
</html>
""")


@app.route("/api/status")
def api_status():

    try:
        log=open(
        f"{MONITOR}/recovery.log"
        ).read()[-3000:]
    except:
        log="NO LOG"

    return jsonify({
        "services":services(),
        "system":system_info(),
        "log":log
    })


@app.route("/restart_bot")
def restart_bot():

    subprocess.Popen(
        f"cd {BOT_DIR} && ./stop_bot.sh && ./start_bot.sh",
        shell=True
    )

    return "OK"


@app.route("/backup")
def backup():

    subprocess.Popen(
        f"{MONITOR}/backup_manager.sh",
        shell=True
    )

    return "OK"


@app.route("/health")
def health():

    subprocess.Popen(
        f"{MONITOR}/health_check.sh",
        shell=True
    )

    return "OK"


if __name__=="__main__":

    app.run(
        host="127.0.0.1",
        port=8899
    )



@app.route("/api/v17")
def api_v17():
    try:
        import requests
        r=requests.get("http://127.0.0.1:8787/api/v1/health",timeout=3)
        return jsonify({
            "status":"OK",
            "data":r.json()
        })
    except Exception as e:
        return jsonify({
            "status":"DOWN",
            "error":str(e)
        })


@app.route("/action/<name>")
def action(name):

    log="/home/lastchar/monitoring/control_center_actions.log"

    import subprocess

    commands={
        "restart_bot":
        "cd /home/lastchar/lastcharter_v14_0_1 && ./stop_bot.sh && sleep 3 && ./start_bot.sh",

        "restart_v17":
        "/home/lastchar/monitoring/v17_watchdog.sh",

        "backup":
        "/home/lastchar/monitoring/backup_manager.sh",

        "health":
        "/home/lastchar/monitoring/health_check.sh"
    }

    if name not in commands:
        return "INVALID"

    result=subprocess.run(
        commands[name],
        shell=True,
        capture_output=True,
        text=True
    )

    with open(log,"a") as f:
        f.write(
            f"{datetime.now()} ACTION={name}\n"
        )

    return jsonify({
        "action":name,
        "output":result.stdout[-1000:],
        "error":result.stderr[-1000:]
    })
