from flask import Flask, jsonify, render_template_string, request, redirect, session
import os
from dotenv import load_dotenv
import subprocess
import psutil
import requests
from datetime import datetime

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

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

PASSWORD=os.getenv("CONTROL_PASSWORD","lastchar123")


def run(cmd):
    try:
        return subprocess.getoutput(cmd)[-2000:]
    except:
        return ""


def check_bot():
    try:
        pid=open(f"{BOT_DIR}/bot.pid").read().strip()
        if psutil.pid_exists(int(pid)):
            return f"OK PID={pid}"
    except:
        pass
    return "DOWN"


def check_contact():
    if os.path.exists(
        "/home/lastchar/contact_center_api_clean/passenger_wsgi.py"
    ):
        return "OK Passenger"
    return "DOWN"


def check_v17():
    try:
        r=requests.get(
            "http://127.0.0.1:8787/api/v1/health",
            timeout=3
        )
        if r.ok:
            return "OK "+r.json().get("version","")
    except:
        pass
    return "DOWN"


def backup_info():
    path=f"{BASE}/backups/daily"
    try:
        files=sorted(
            os.listdir(path),
            reverse=True
        )
        if files:
            f=files[0]
            full=os.path.join(path,f)
            size=os.path.getsize(full)//1024//1024
            return f"{f} ({size} MB)"
    except:
        pass
    return "No Backup"


def status():

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

        "system":{
            "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")
        },

        "backup":backup_info(),

        "logs":run(
            "tail -40 /home/lastchar/monitoring/recovery.log"
        )
    }


@app.route("/login",methods=["GET","POST"])
def login():

    if request.method=="POST":

        if request.form.get("password")==PASSWORD:
            session["login"]=True
            return redirect("/")

    return """
    <form method=post style='padding:50px;font-family:tahoma'>
    <h2>Lastcharter Control Center</h2>
    <input name=password type=password>
    <button>Login</button>
    </form>
    """


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

    if not session.get("login"):
        return redirect("/login")

    return render_template_string("""
<html>
<head>
<title>Lastcharter Control Center</title>

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

.card{
background:#1e293b;
padding:20px;
margin:10px;
border-radius:15px;
display:inline-block;
min-width:240px
}

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

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

pre{
background:#020617;
padding:20px;
border-radius:12px
}
</style>

</head>

<body>

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

<div id=data>
Loading...
</div>

<script>

async function load(){

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

let h=""

for(let x in d.services){

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


h+=`
<h2>System</h2>
<div class=card>CPU ${d.system.CPU}%</div>
<div class=card>RAM ${d.system.RAM}%</div>
<div class=card>DISK ${d.system.DISK}%</div>

<h2>Backup</h2>
<div class=card>${d.backup}</div>


<h2>Actions</h2>

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

<button onclick="act('restart_v17')">
Restart V17
</button>

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

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


<h2>Logs</h2>
<pre>${d.logs}</pre>

`

document.getElementById("data").innerHTML=h

}


async function act(x){

await fetch('/action/'+x)

alert("Done")

}


load()

setInterval(load,10000)

</script>

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


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


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

    cmds={

    "restart_bot":
    f"cd {BOT_DIR} && ./stop_bot.sh && sleep 3 && ./start_bot.sh",

    "restart_v17":
    f"{MONITOR}/v17_watchdog.sh",

    "backup":
    f"{MONITOR}/backup_manager.sh",

    "health":
    f"{MONITOR}/health_check.sh"

    }

    if name in cmds:

        subprocess.Popen(
            cmds[name],
            shell=True
        )

        with open(
        f"{MONITOR}/control_center_actions.log",
        "a"
        ) as f:

            f.write(
            f"{datetime.now()} {name}\n"
            )

    return "OK"


if __name__=="__main__":

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

