#!/usr/bin/python3
# -*- coding: utf-8 -*-
import subprocess, os, random, string, sys, shutil, socket, zipfile, urllib.request, urllib.error, urllib.parse, json, base64
from itertools import cycle

# --- CONFIGURAÇÕES DE LINKS DO SEU SERVIDOR ---
BASE_URL = "https://tvsbr.top/arquivos/XTREAM-UI/"
rDownloadURL = {
    "main": BASE_URL + "main_xui_masoudgb.zip", 
    "sub": BASE_URL + "sub_xui_masoudgb.zip"
}

rPackages = ["libcurl4", "libxslt1-dev", "libgeoip-dev", "libonig-dev", "e2fsprogs", "wget", "mcrypt", "nscd", "htop", "zip", "unzip", "mc", "mariadb-server", "libpng16-16", "python3-paramiko", "python-is-python3"]
rInstall = {"MAIN": "main", "LB": "sub"}
rUpdate = {"UPDATE": "update"}
rMySQLCnf = base64.b64decode("IyBYdHJlYW0gQ29kZXMgLSBVcGRhdGVkIGZvciBNYXJpYURCIDEwLjExCgpbY2xpZW50XQpwb3J0ID0gMzMwNgoKW215c3FsZF9zYWZlXQpuaWNlID0gMAoKW215c3FsZF0KdXNlciA9IG15c3FsCnBvcnQgPSA3OTk5CmJhc2VkaXIgPSAvdXNyCmRhdGFkaXIgPSAvdmFyL2xpYi9teXNxbAp0bXBkaXIgPSAvdG1wCmxjLW1lc3NhZ2VzLWRpciA9IC91c3Ivc2hhcmUvbXlzcWwKc2tpcC1leHRlcm5hbC1sb2NraW5nCnNraXAtbmFtZS1yZXNvbHZlPTEKCmJpbmQtYWRkcmVzcyA9ICoKa2V5X2J1ZmZlcl9zaXplID0gMTI4TQoKbXlpc2FtLXJlY292ZXItb3B0aW9ucyA9IEJBQ0tVUAptYXhfYWxsb3dlZF9wYWNrZXQgPSA2NE0KbWF4X2xlbmd0aF9mb3Jfc29ydF9kYXRhID0gODE5MgpxdWVyeV9jYWNoZV9saW1pdCA9IDRNCnF1ZXJ5X2NhY2hlX3NpemUgPSAwCnF1ZXJ5X2NhY2hlX3R5cGUgPSAwCgpleHBpcmVfbG9nc19kYXlzID0gMTAKbWF4X2JpbmxvZ19zaXplID0gMTAwTQoKbWF4X2Nvbm5lY3Rpb25zID0gMjAwMApiYWNrX2xvZyA9IDQwOTYKb3Blbl9maWxlc19saW1pdCA9IDE2Mzg0Cmlubm9kYl9vcGVuX2ZpbGVzID0gMTYzODQKbWF4X2Nvbm5lY3RfZXJyb3JzID0gMzA3Mgp0YWJsZV9vcGVuX2NhY2hlID0gNDA5Ngp0YWJsZV9kZWZpbml0aW9uX2NhY2hlID0gNDA5NgoKdG1wX3RhYmxlX3NpemUgPSAxRwptYXhfaGVhcF90YWJsZV9zaXplID0gMUcKCmlubm9kYl9idWZmZXJfcG9vbF9zaXplID0gMUcKaW5ub2RiX2xvZ19maWxlX3NpemUgPSA1MTJNCmlubm9kYl9sb2dfYnVmZmVyX3NpemUgPSAxNk0KaW5ub2RiX2ZsdXNoX2xvZ19hdF90cnhfY29tbWl0ID0gMgppbm5vZGJfZmx1c2hfbWV0aG9kID0gT19ESVJFQ1QKcGVyZm9ybWFuY2Vfc2NoZW1hID0gT04KaW5ub2RiLWZpbGUtcGVyLXRhYmxlID0gMQppbm5vZGJfaW9fY2FwYWNpdHkgPSAyMDAwMAppbm5vZGJfcmVhZF9pb190aHJlYWRzID0gNjQKaW5ub2RiX3wyaXRlX2lvX3RocmVhZHMgPSA2NAppbm5vZGJfdGhyZWFkX2NvbmN1cnJlbmN5ID0gMAppbm5vZGJfdGFibGVfbG9ja3MgPSAwCmlubm9kYl9sb2NrX3dhaXRfdGltZW91dCA9IDAKaW5ub2RiX2RlYWRsb2NrX2RldGVjdCA9IDAKCnNxbC1tb2RlID0gIk5PX0VOR0lORV9TVUJTVElUVVRJT04iCgpbbXlzcWxkdW1wXQpxdWljawpxdW90ZS1uYW1lcwptYXhfYWxsb3dlZF9wYWNrZXQgPSAxNk0=")

rVersions = {"24.04": "noble"}

class col:
    GREEN = '\033[32m'; YELLOW = '\033[33m'; RED = '\033[31m'; BOLD = '\033[1m'; ENDC = '\033[0m'; BRIGHT_GREEN = '\033[92m'; BRIGHT_YELLOW = '\033[93m'; BRIGHT_RED = '\033[91m'

def generate(length=19): return ''.join(random.choice(string.ascii_letters + string.digits) for i in range(length))

def getIP():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    return s.getsockname()[0]

def getVersion():
    try: return os.popen("lsb_release -d").read().split(":")[-1].strip()
    except: return ""

def printc(rText, rColour=col.BRIGHT_GREEN, rPadding=0, rLimit=46):
    print("%s ┌─────────────────────────────────────────────────┐ %s" % (rColour, col.ENDC))
    array = [rText[i:i+rLimit] for i in range(0, len(rText), rLimit)]
    for i in array : print("%s │ %s%s%s │ %s" % (rColour, " "*round(23-(len(i)/2)), i, " "*round(46-(22-(len(i)/2))-len(i)), col.ENDC))
    print("%s └─────────────────────────────────────────────────┘ %s" % (rColour, col.ENDC))

def is_installed(package_name):
    try:
        subprocess.run(['dpkg', '-s', package_name], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        return True
    except: return False

def prepare(rType="MAIN"):
    printc("Preparing Installation")
    subprocess.run("apt-get update -y > /dev/null 2>&1", shell=True)
    if rType == "MAIN":
        subprocess.run("apt-get install -y software-properties-common > /dev/null 2>&1", shell=True)
        subprocess.run("curl -fsSL https://mariadb.org/mariadb_release_signing_key.asc | gpg --dearmor -o /usr/share/keyrings/mariadb-archive-keyring.gpg > /dev/null 2>&1", shell=True)
        subprocess.run("echo y | sudo add-apt-repository -y 'deb [arch=amd64] [signed-by=/usr/share/keyrings/mariadb-archive-keyring.gpg] https://mirrors.xtom.com/mariadb/repo/11.5/ubuntu noble main' > /dev/null 2>&1", shell=True)
        subprocess.run("apt-get update -y > /dev/null 2>&1", shell=True)
    for rPackage in rPackages:
        if not is_installed(rPackage):
            printc(f"Installing {rPackage}")
            subprocess.run(f"apt-get install {rPackage} -y > /dev/null 2>&1", shell=True)
    return True

def install(rType="MAIN"):
    printc("Downloading Software")
    rURL = rDownloadURL[rInstall[rType]]
    zip_path = "/tmp/xtreamcodes.zip"
    subprocess.run(['curl', '-L', '-s', '-o', zip_path, rURL])
    if os.path.exists(zip_path):
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:
            zip_ref.extractall("/home/xtreamcodes/")
        os.remove(zip_path)
        return True
    return False

def update(rType="MAIN"):
    rlink = BASE_URL + ("update.zip" if rType == "UPDATE" else "release_22f.zip")
    printc("Downloading Update")
    os.system('curl -L -s -o "/tmp/update.zip" "%s"' % rlink)
    if os.path.exists("/tmp/update.zip"):
        os.system('unzip /tmp/update.zip -d /tmp/update/ > /dev/null && cp -rf /tmp/update/XtreamUI-master/* /home/xtreamcodes/iptv_xtream_codes/ > /dev/null')
        os.system("chown -R xtreamcodes:xtreamcodes /home/xtreamcodes/ && chmod +x /home/xtreamcodes/iptv_xtream_codes/permissions.sh")
        os.system("/home/xtreamcodes/iptv_xtream_codes/permissions.sh > /dev/null")
        return True
    return False

def mysql(rUsername, rPassword):
    printc("Configuring MySQL & Database")
    # BAIXA SEU BANCO DE DADOS PERSONALIZADO
    os.system(f"curl -L -s -o /home/xtreamcodes/iptv_xtream_codes/database.sql {BASE_URL}database.sql")
    
    if os.path.exists("/etc/mysql/my.cnf"):
        with open("/etc/mysql/my.cnf", "wb") as f: f.write(rMySQLCnf)
        os.system("systemctl restart mariadb > /dev/null")
    
    rExtra = "" # Root sem senha por padrão na instalação limpa
    os.system('mysql -u root%s -e "DROP DATABASE IF EXISTS xtream_iptvpro; CREATE DATABASE IF NOT EXISTS xtream_iptvpro;"' % rExtra)
    os.system("mysql -u root%s xtream_iptvpro < /home/xtreamcodes/iptv_xtream_codes/database.sql" % rExtra)
    os.system('mysql -u root%s -e "CREATE USER \'%s\'@\'%%\' IDENTIFIED BY \'%s\'; GRANT ALL PRIVILEGES ON xtream_iptvpro.* TO \'%s\'@\'%%\' WITH GRANT OPTION; FLUSH PRIVILEGES;"' % (rExtra, rUsername, rPassword, rUsername))
    return True

def encrypt(rHost="127.0.0.1", rUsername="user_iptvpro", rPassword="", rDatabase="xtream_iptvpro", rServerID=1, rPort=7999):
    rf = open('/home/xtreamcodes/iptv_xtream_codes/config', 'wb')
    lestring=''.join(chr(ord(c)^ord(k)) for c,k in zip('{"host":"%s","db_user":"%s","db_pass":"%s","db_name":"%s","server_id":"%d", "db_port":"%d"}' % (rHost, rUsername, rPassword, rDatabase, rServerID, rPort), cycle('5709650b0d7806074842c6de575025b1')))
    rf.write(base64.b64encode(bytes(lestring, 'ascii')))
    rf.close()

def configure():
    printc("Final System Configuration")
    # BAIXA GEOLITE E MONITOR DO SEU SERVIDOR
    os.system(f"curl -L -s -o /home/xtreamcodes/iptv_xtream_codes/GeoLite2.mmdb {BASE_URL}GeoLite2.mmdb")
    os.system(f"curl -L -s -o /home/xtreamcodes/iptv_xtream_codes/crons/pid_monitor.php {BASE_URL}pid_monitor.php")
    
    os.system("chown xtreamcodes:xtreamcodes -R /home/xtreamcodes")
    os.system("chmod -R 0777 /home/xtreamcodes")
    os.system("ln -sf /home/xtreamcodes/iptv_xtream_codes/bin/ffmpeg /usr/bin/ffmpeg")
    os.system("chmod +x /home/xtreamcodes/iptv_xtream_codes/start_services.sh")

def start():
    printc("Starting Xtream Codes Services")
    os.system("/home/xtreamcodes/iptv_xtream_codes/start_services.sh > /dev/null")

if __name__ == "__main__":
    rVersion = os.popen('lsb_release -sr').read().strip()
    if rVersion != "24.04":
        printc("Use Ubuntu 24.04", col.RED)
        sys.exit(1)

    printc("X-UI PERSONALIZADO: TVSBR.TOP", col.GREEN)
    rType = input("  Installation Type [MAIN, LB, UPDATE]: ").upper()
    
    if rType in ["MAIN", "LB"]:
        rPassword = generate() if rType == "MAIN" else input("  MySQL Password: ")
        if prepare(rType):
            if install(rType):
                if rType == "MAIN": mysql("user_iptvpro", rPassword)
                encrypt("127.0.0.1", "user_iptvpro", rPassword, "xtream_iptvpro", 1, 7999)
                configure()
                if rType == "MAIN": update(rType)
                start()
                printc("INSTALADO COM SUCESSO!", col.GREEN)
                print(f"URL: http://{getIP()}:25500 | User: admin / Pass: admin")