#!/bin/bash
# ==============================================================================
# 🚀 Instalador Completo - Office Xtream v2.3 (Firewall + EPG Cron + HLS Multiplex) 🚀
# ==============================================================================

clear
echo "======================================================="
echo "🚀 Instalador Office Xtream (Otimizado para Ubuntu 24.04)"
echo "======================================================="
sleep 2

# === CONFIGURAÇÕES ===
read -p "🌍 Digite o domínio do painel (ex: painel.brtvs.top): " DOMAIN
read -p "📧 Digite o e-mail do admin (para SSL e Backups): " ADMIN_EMAIL

# Variáveis com senhas FIXAS conforme solicitado
DB_NAME="officextream"
DB_USER="user_officextream"
DB_PASS="pass_officextream"
ROOT_DB_PASS="root123" # Senha fixa para o usuário root do banco

PHP_VERSION="8.1"
PAINEL_URL="https://paineloffice.tvsbr.top/Koffice/install/painelofficextream.zip"
SQL_URL="https://paineloffice.tvsbr.top/Koffice/install/painelofficextream.sql"
WWW_DIR="/var/www/html"
BACKUP_DIR="/var/backups/officextream"

# === 0. LIMPEZA DA INSTALAÇÃO ANTIGA ===
echo "🧹 Passo 0/10: Limpando a instalação antiga..."
systemctl stop apache2 >/dev/null 2>&1

# Removendo ficheiros do painel, phpMyAdmin e backups antigos
rm -rf ${WWW_DIR}/*
rm -rf /usr/share/phpmyadmin
rm -rf ${BACKUP_DIR}
rm -f /usr/local/bin/officextream_backup.sh

# Removendo configurações do domínio no Apache
rm -f /etc/apache2/sites-available/${DOMAIN}.conf
rm -f /etc/apache2/sites-enabled/${DOMAIN}.conf

# Limpando o Crontab (rotinas antigas)
crontab -r 2>/dev/null

# Limpando base de dados antiga (tenta com e sem palavra-passe)
systemctl start mariadb >/dev/null 2>&1
mariadb -u root -e "DROP DATABASE IF EXISTS ${DB_NAME}; DROP USER IF EXISTS '${DB_USER}'@'localhost';" >/dev/null 2>&1
mariadb -u root -p"${ROOT_DB_PASS}" -e "DROP DATABASE IF EXISTS ${DB_NAME}; DROP USER IF EXISTS '${DB_USER}'@'localhost';" >/dev/null 2>&1

echo "✅ Instalação antiga limpa com sucesso!"
sleep 2

# === 1. ATUALIZAÇÃO E DEPENDÊNCIAS (INCLUINDO UFW, POSTFIX E FFMPEG) ===
echo "🔧 Passo 1/10: Atualizando o sistema e instalando dependências base..."
export DEBIAN_FRONTEND=noninteractive
debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'"
debconf-set-selections <<< "postfix postfix/mailname string $DOMAIN"

apt-get update -y && apt-get upgrade -y >/dev/null 2>&1

# Adicionando repositório para o PHP 8.1 funcionar no Ubuntu 24.04
apt-get install -y software-properties-common ca-certificates lsb-release apt-transport-https >/dev/null 2>&1
LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -y >/dev/null 2>&1
apt-get update -y >/dev/null 2>&1

# Agora instala todos os pacotes corretamente (FFMPEG INCLUÍDO AQUI)
echo "📦 Baixando pacotes principais (Web, DB, PHP, FFmpeg)..."
apt-get install -y curl wget unzip apache2 mariadb-server ufw ffmpeg \
php${PHP_VERSION} php${PHP_VERSION}-cli php${PHP_VERSION}-mysql php${PHP_VERSION}-curl php${PHP_VERSION}-xml \
php${PHP_VERSION}-mbstring php${PHP_VERSION}-zip php${PHP_VERSION}-gd \
libapache2-mod-php${PHP_VERSION} certbot python3-certbot-apache mailutils postfix >/dev/null 2>&1
echo "✅ Dependências instaladas (incluindo FFmpeg)."
sleep 1

# === 2. CONFIGURANDO O FIREWALL (UFW) ===
echo "🔒 Passo 2/10: Configurando o firewall para liberar as portas..."
ufw allow ssh >/dev/null 2>&1      # Essencial para não perder o acesso!
ufw allow 80/tcp >/dev/null 2>&1    # HTTP e renovação SSL
ufw allow 443/tcp >/dev/null 2>&1   # HTTPS (acesso seguro ao painel)
ufw allow 8080/tcp >/dev/null 2>&1  # Porta solicitada para streaming/serviços

# Habilita o firewall sem pedir confirmação
ufw --force enable >/dev/null 2>&1

echo "✅ Firewall ativado. Portas liberadas: SSH (22), 80, 443, 8080."
sleep 1

# === 3. CONFIGURAÇÕES DO PHP ===
echo "⚙️ Passo 3/10: Ajustando os limites do PHP..."
PHP_INI="/etc/php/${PHP_VERSION}/apache2/php.ini"
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 800M/" $PHP_INI
sed -i "s/post_max_size = .*/post_max_size = 800M/" $PHP_INI
sed -i "s/memory_limit = .*/memory_limit = 1024M/" $PHP_INI
sed -i "s/max_execution_time = .*/max_execution_time = 600/" $PHP_INI
sed -i "s/max_input_time = .*/max_input_time = 600/" $PHP_INI
echo "✅ Limites do PHP ajustados."
sleep 1

# === 4. INSTALANDO PHPMYADMIN ===
echo "🧩 Passo 4/10: Instalando o phpMyAdmin..."
cd /usr/share/ && rm -rf phpmyadmin
wget -q https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip -O phpmyadmin.zip
unzip -q phpmyadmin.zip && mv phpMyAdmin-5.2.1-all-languages phpmyadmin && rm phpmyadmin.zip
chown -R www-data:www-data phpmyadmin && chmod -R 755 phpmyadmin

cat <<EOF > /etc/apache2/conf-available/phpmyadmin.conf
Alias /phpmyadmin /usr/share/phpmyadmin
<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php
    AllowOverride All
    Require all granted
</Directory>
EOF

a2enconf phpmyadmin >/dev/null 2>&1 && a2enmod rewrite >/dev/null 2>&1
echo "✅ phpMyAdmin instalado."
sleep 1

# === 5. CONFIGURANDO BANCO DE DADOS (COM SENHAS FIXAS) ===
echo "🗄️ Passo 5/10: Configurando a base de dados MariaDB..."
systemctl restart mariadb && systemctl enable mariadb >/dev/null 2>&1

# Tenta definir a palavra-passe pela primeira vez (ignora o erro se já existir da instalação anterior)
mariadb -u root >/dev/null 2>&1 <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '${ROOT_DB_PASS}';
DROP USER IF EXISTS ''@'localhost';
DROP DATABASE IF EXISTS test;
FLUSH PRIVILEGES;
EOF

# Agora utiliza a palavra-passe correta para criar a base de dados do painel
mariadb -u root -p"${ROOT_DB_PASS}" >/dev/null 2>&1 <<EOF
DROP DATABASE IF EXISTS ${DB_NAME};
CREATE DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
DROP USER IF EXISTS '${DB_USER}'@'localhost';
CREATE USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
FLUSH PRIVILEGES;
EOF

wget -q ${SQL_URL} -O /tmp/officextream.sql
mariadb -u root -p"${ROOT_DB_PASS}" ${DB_NAME} < /tmp/officextream.sql 2>/dev/null
echo "✅ Base de dados configurada com as credenciais solicitadas."
sleep 1

# === 6. INSTALANDO O PAINEL ===
echo "💻 Passo 6/10: Instalando os ficheiros do painel..."
wget -q ${PAINEL_URL} -O /tmp/painel.zip
rm -rf ${WWW_DIR}/* && unzip -o /tmp/painel.zip -d ${WWW_DIR} >/dev/null 2>&1
chown -R www-data:www-data ${WWW_DIR} && chmod -R 755 ${WWW_DIR}
echo "✅ Painel instalado."
sleep 1

# === 7. CONFIGURANDO DOMÍNIO E SSL ===
echo "🌐 Passo 7/10: Configurando o domínio e instalando o SSL..."
VHOST_FILE="/etc/apache2/sites-available/${DOMAIN}.conf"
cat <<EOF > $VHOST_FILE
<VirtualHost *:80>
    ServerName ${DOMAIN}
    DocumentRoot ${WWW_DIR}
    <Directory ${WWW_DIR}>
        AllowOverride All
    </Directory>
</VirtualHost>
EOF

a2dissite 000-default.conf >/dev/null 2>&1 && a2ensite ${DOMAIN}.conf >/dev/null 2>&1
systemctl restart apache2 && systemctl enable apache2 >/dev/null 2>&1

certbot --apache --non-interactive --agree-tos -d ${DOMAIN} -m ${ADMIN_EMAIL} --redirect
echo "✅ Domínio configurado com SSL (HTTPS)."
sleep 1

# === 8. CONFIGURANDO O SISTEMA HLS MULTIPLEX E ANTI-TRAVAMENTO ===
echo "🎥 Passo 8/10: Configurando o rastreador de clientes e HLS..."
mkdir -p ${WWW_DIR}/top/api
mkdir -p ${WWW_DIR}/top/streams

# Criando o entregador de vídeo otimizado
cat << 'PHP' > ${WWW_DIR}/top/api/ts_wrapper.php
<?php
error_reporting(0);
$file = $_GET['file'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'];

$base_dir = realpath(__DIR__ . '/../streams/');
$real_path = realpath($base_dir . '/' . $file);

if ($real_path && strpos($real_path, $base_dir) === 0 && file_exists($real_path)) {
    require_once '../includes/db.php';
    if (session_status() === PHP_SESSION_ACTIVE) { session_write_close(); }

    if (preg_match('/canal_([0-9]+)/', $file, $matches)) {
        $channel_id = $matches[1];
        try {
            $pdo->prepare("UPDATE active_connections SET start_time = ? WHERE user_ip = ? AND content_id = ? AND stream_type = 'live'")->execute([time(), $ip, $channel_id]);
        } catch (Exception $e) {}
    }
    
    $pdo = null;

    header('Content-Type: video/mp2t');
    header('Content-Length: ' . filesize($real_path));
    header('Cache-Control: no-cache, no-store, must-revalidate');
    
    if (ob_get_level()) { ob_end_clean(); }
    flush();
    
    readfile($real_path);
    exit;
}
http_response_code(404);
?>
PHP
chmod 644 ${WWW_DIR}/top/api/ts_wrapper.php

# Criando o .htaccess invisível
cat << 'HTACCESS' > ${WWW_DIR}/top/streams/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} \.ts$
RewriteRule ^(.*)$ ../api/ts_wrapper.php?file=$1 [L,QSA]
HTACCESS
chmod 644 ${WWW_DIR}/top/streams/.htaccess

# Forçando o Apache a respeitar o .htaccess na pasta de streams
cat << EOF > /etc/apache2/conf-available/hls-override.conf
<Directory ${WWW_DIR}/top/streams/>
    AllowOverride All
</Directory>
EOF
a2enconf hls-override >/dev/null 2>&1
a2enmod rewrite >/dev/null 2>&1
echo "✅ Sistema HLS Multiplex configurado."
sleep 1

# === 9. CONFIGURANDO ROTINAS AUTOMÁTICAS (CRON) ===
echo "🔄 Passo 9/10: Configurando rotinas automáticas (Backup e EPG)..."
mkdir -p ${BACKUP_DIR}

# Script de backup
cat <<EOF > /usr/local/bin/officextream_backup.sh
#!/bin/bash
TIMESTAMP=\$(date +"%Y-%m-%d_%H-%M")
BACKUP_DIR="${BACKUP_DIR}"
DB_NAME="${DB_NAME}"
DB_USER="${DB_USER}"
DB_PASS="${DB_PASS}"
ADMIN_EMAIL="${ADMIN_EMAIL}"
SQL_FILE="\$BACKUP_DIR/db_\$TIMESTAMP.sql.gz"
FILES_FILE="\$BACKUP_DIR/files_\$TIMESTAMP.tar.gz"
mysqldump -u"\$DB_USER" -p"\$DB_PASS" "\$DB_NAME" | gzip > \$SQL_FILE
tar -czf \$FILES_FILE -C /var/www html
echo "Backup automático do seu painel Office Xtream (\$DOMAIN) concluído." | mail -a "From: backup@\$DOMAIN" -s "Backup Office Xtream - \$DOMAIN - \$TIMESTAMP" -A "\$SQL_FILE" -A "\$FILES_FILE" "\$ADMIN_EMAIL"
find \$BACKUP_DIR -type f -name "*.gz" -mtime +7 -delete
EOF
chmod +x /usr/local/bin/officextream_backup.sh

# Limpa crontab anterior para evitar duplicatas
crontab -r 2>/dev/null

# Adiciona as rotinas ao crontab do root
(
    echo "5 4 * * * /usr/local/bin/officextream_backup.sh >/dev/null 2>&1"
    echo "5 16 * * * /usr/local/bin/officextream_backup.sh >/dev/null 2>&1"
    echo "0 * * * * /usr/bin/php ${WWW_DIR}/epg_importer.php >/dev/null 2>&1"
) | crontab -

echo "✅ Backups (2x/dia) e Importador EPG (1x/hora) configurados."
sleep 1

# === 10. FINALIZAÇÃO E ENVIO DE E-MAIL ===
echo "✉️ Passo 10/10: Finalizando e enviando os dados de acesso..."
systemctl restart apache2 mariadb postfix && systemctl enable postfix >/dev/null 2>&1

EMAIL_BODY=$(cat <<EOF
Instalação do seu painel Office Xtream concluída.

==============================================
 DADOS DE ACESSO AO PHPMYADMIN (Controle Total)
==============================================
🌍 phpMyAdmin: https://${DOMAIN}/phpmyadmin
👤 Utilizador: root
🔑 Palavra-passe: ${ROOT_DB_PASS}
(AVISO: É altamente recomendável alterar esta palavra-passe!)

==============================================
 DADOS DA BASE DE DADOS (Para o Painel)
==============================================
🗄️ Nome da Base de Dados: ${DB_NAME}
👤 Utilizador da Base de Dados: ${DB_USER}
🔑 Palavra-passe: ${DB_PASS}

==============================================
- O seu painel está online em: https://${DOMAIN}/
- O importador de EPG irá rodar a cada hora.
- Backups serão enviados para este e-mail 2x ao dia.
- O Firewall está ATIVO, liberando as portas 80, 443 e 8080.
- 🚀 O Modo HLS (Live Multiplex e Anti-Travamento) já vem instalado de fábrica!
EOF
)

echo "$EMAIL_BODY" | mail -a "From: admin@${DOMAIN}" -s "✅ Instalação Office Xtream Concluída - ${DOMAIN}" "$ADMIN_EMAIL"

clear
echo "======================================================"
echo "✅ INSTALAÇÃO CONCLUÍDA COM SUCESSO!"
echo "======================================================"
echo "Os dados foram enviados para o e-mail: ${ADMIN_EMAIL}"
echo
echo "--- ACESSO AO PHPMYADMIN (Controle Total) ---"
echo "🌍 Link: https://${DOMAIN}/phpmyadmin"
echo "👤 Utilizador: root"
echo "🔑 Palavra-passe: ${ROOT_DB_PASS}"
echo "❗️ Lembre-se de alterar esta palavra-passe por segurança!"
echo
echo "--- DADOS PARA O PAINEL ---"
echo "🌍 Link: https://${DOMAIN}"
echo "👤 Utilizador: admin"
echo "🔑 Palavra-passe: admin"
echo
echo "--- ROTINAS AUTOMÁTICAS ---"
echo "🔄 EPG Importer: A rodar a cada hora."
echo "🔄 Backups: A rodar duas vezes por dia."
echo "🔒 Firewall: ATIVO (Portas 80, 443, 8080 abertas)."
echo "🎥 Modo Live (HLS Multiplex): Instalado, a monitorizar e a rodar Liso!"
echo "======================================================"
