#!/bin/bash
# =====================================================
# NOC Monitor - Tam Kurulum Scripti
# noc.teknolojik.tr
# Sunucu: server.teknolojikyazilim.com
# =====================================================
# Kullanim:
#   1. Bu dosyayi sunucuya yukleyin
#   2. chmod +x install-noc.sh
#   3. ./install-noc.sh
# =====================================================

set -e

# Renkler
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

echo ""
echo -e "${CYAN}=================================================${NC}"
echo -e "${CYAN}  NOC Monitor v1.1.0 - Kurulum Scripti${NC}"
echo -e "${CYAN}  noc.teknolojik.tr${NC}"
echo -e "${CYAN}=================================================${NC}"
echo ""

# =====================================================
# DEGISKENLER
# =====================================================
INSTALL_DIR="/home/teknolojikyaz/public_html/noc.teknolojik.tr"
DB_NAME="teknolojikyaz_noc"
DB_USER="teknolojikyaz_noc"
DB_PASS='hDs=+h7(~hH7?kDs'
CPANEL_USER="teknolojikyaz"
PHP_BIN="/opt/cpanel/ea-php81/root/usr/bin/php"

# =====================================================
# 1. DIZIN OLUSTUR
# =====================================================
echo -e "${YELLOW}[1/8] Dizin hazirlaniyor...${NC}"

if [ -d "$INSTALL_DIR" ]; then
    echo -e "  ${YELLOW}Mevcut dizin yedekleniyor...${NC}"
    BACKUP_DIR="${INSTALL_DIR}_backup_$(date +%Y%m%d_%H%M%S)"
    mv "$INSTALL_DIR" "$BACKUP_DIR"
    echo -e "  ${GREEN}Yedek: $BACKUP_DIR${NC}"
fi

mkdir -p "$INSTALL_DIR"
echo -e "  ${GREEN}Dizin olusturuldu: $INSTALL_DIR${NC}"

# =====================================================
# 2. VERITABANI
# =====================================================
echo -e "${YELLOW}[2/8] Veritabani kontrol ediliyor...${NC}"

# Veritabaninin var olup olmadigini kontrol et
DB_EXISTS=$(mysql -u"$DB_USER" -p"$DB_PASS" -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$DB_NAME'" 2>/dev/null | grep "$DB_NAME" || true)

if [ -n "$DB_EXISTS" ]; then
    echo -e "  ${YELLOW}Veritabani zaten mevcut, tablolar kontrol ediliyor...${NC}"
    TABLE_COUNT=$(mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME'" -sN 2>/dev/null)
    if [ "$TABLE_COUNT" -gt "0" ]; then
        echo -e "  ${YELLOW}Mevcut tablolar bulundu ($TABLE_COUNT tablo). Drop & recreate? (y/n)${NC}"
        read -r CONFIRM
        if [ "$CONFIRM" = "y" ] || [ "$CONFIRM" = "Y" ]; then
            echo -e "  ${YELLOW}Tablolar siliniyor...${NC}"
            mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "SET FOREIGN_KEY_CHECKS=0; $(mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e 'SHOW TABLES' -sN | awk '{print "DROP TABLE IF EXISTS \`"$1"\`;"}') SET FOREIGN_KEY_CHECKS=1;" 2>/dev/null
            echo -e "  ${GREEN}Tablolar temizlendi${NC}"
        else
            echo -e "  ${CYAN}Mevcut tablolar korunuyor${NC}"
        fi
    fi
else
    echo -e "  ${GREEN}Veritabani: $DB_NAME (mevcut)${NC}"
fi

# =====================================================
# 3. DOSYALARI OLUSTUR
# =====================================================
echo -e "${YELLOW}[3/8] Proje dosyalari olusturuluyor...${NC}"

# Alt dizinler
mkdir -p "$INSTALL_DIR"/{api,includes,cron,agent/linux,agent/windows,logs,cache,uploads,database}

# --- includes/config.php ---
cat > "$INSTALL_DIR/includes/config.php" << 'CONFIGEOF'
<?php
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../logs/error.log');
date_default_timezone_set('Europe/Istanbul');

define('DB_HOST', 'localhost');
define('DB_NAME', 'teknolojikyaz_noc');
define('DB_USER', 'teknolojikyaz_noc');
define('DB_PASS', 'hDs=+h7(~hH7?kDs');
define('DB_CHARSET', 'utf8mb4');

define('APP_NAME', 'NOC Monitor');
define('APP_VERSION', '1.1.0');
define('APP_URL', 'https://noc.teknolojik.tr');
define('APP_ROOT', dirname(__DIR__));

define('SESSION_NAME', 'noc_session');
define('SESSION_LIFETIME', 86400);

define('JWT_SECRET', '06a56f34e63ecefa0dad65f71b9e2d07602467e21555ba4f92143789edf65eb8');
define('TOKEN_EXPIRY', 86400);

define('AGENT_HEARTBEAT_TIMEOUT', 180);
define('AGENT_SECRET_PREFIX', 'noc_agent_');

define('ENCRYPTION_KEY', 'ac9013e7acc4fec7e665c782f057ef79');
define('ENCRYPTION_METHOD', 'aes-256-cbc');

define('SMTP_HOST', 'mail.teknolojikyazilim.com');
define('SMTP_PORT', 465);
define('SMTP_SECURE', 'ssl');
define('SMTP_USER', 'noc@teknolojik.tr');
define('SMTP_PASS', '');
define('SMTP_FROM_NAME', 'NOC Monitor');

define('TELEGRAM_BOT_TOKEN', '');
define('TELEGRAM_API_URL', 'https://api.telegram.org/bot');

define('LOG_DIR', APP_ROOT . '/logs');
define('CACHE_DIR', APP_ROOT . '/cache');
define('UPLOAD_DIR', APP_ROOT . '/uploads');

define('MAX_LOGIN_ATTEMPTS', 5);
define('LOGIN_LOCKOUT_MINUTES', 15);
define('API_RATE_LIMIT', 100);
define('DATA_RETENTION_DAYS', 90);

define('DEFAULT_PING_INTERVAL', 60);
define('DEFAULT_SNMP_INTERVAL', 300);
define('ALERT_COOLDOWN', 300);

define('PHP_BINARY', '/opt/cpanel/ea-php81/root/usr/bin/php');
CONFIGEOF

echo -e "  ${GREEN}config.php${NC}"

# --- includes/Database.php ---
cat > "$INSTALL_DIR/includes/Database.php" << 'DBEOF'
<?php
class Database {
    private static ?PDO $instance = null;
    public static function getInstance(): PDO {
        if (self::$instance === null) {
            try {
                $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET;
                self::$instance = new PDO($dsn, DB_USER, DB_PASS, [
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                    PDO::ATTR_EMULATE_PREPARES => false,
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"
                ]);
            } catch (PDOException $e) {
                error_log('DB Connection Error: ' . $e->getMessage());
                http_response_code(500);
                die(json_encode(['error' => 'Database connection failed']));
            }
        }
        return self::$instance;
    }
    public static function query(string $sql, array $params = []): PDOStatement {
        $stmt = self::getInstance()->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }
    public static function fetch(string $sql, array $params = []): ?array {
        $result = self::query($sql, $params)->fetch();
        return $result ?: null;
    }
    public static function fetchAll(string $sql, array $params = []): array {
        return self::query($sql, $params)->fetchAll();
    }
    public static function insert(string $table, array $data): int {
        $cols = implode(', ', array_map(fn($c) => "`$c`", array_keys($data)));
        $placeholders = implode(', ', array_fill(0, count($data), '?'));
        $sql = "INSERT INTO `$table` ($cols) VALUES ($placeholders)";
        self::query($sql, array_values($data));
        return (int) self::getInstance()->lastInsertId();
    }
    public static function update(string $table, array $data, string $where, array $whereParams = []): int {
        $set = implode(', ', array_map(fn($c) => "`$c` = ?", array_keys($data)));
        $sql = "UPDATE `$table` SET $set WHERE $where";
        $stmt = self::query($sql, array_merge(array_values($data), $whereParams));
        return $stmt->rowCount();
    }
}
DBEOF

echo -e "  ${GREEN}Database.php${NC}"

# --- includes/Encryption.php ---
cat > "$INSTALL_DIR/includes/Encryption.php" << 'ENCEOF'
<?php
class Encryption {
    public static function encrypt(string $plaintext): string {
        $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length(ENCRYPTION_METHOD));
        $encrypted = openssl_encrypt($plaintext, ENCRYPTION_METHOD, ENCRYPTION_KEY, 0, $iv);
        return base64_encode($iv . '::' . $encrypted);
    }
    public static function decrypt(string $ciphertext): string {
        $parts = explode('::', base64_decode($ciphertext), 2);
        if (count($parts) !== 2) return '';
        [$iv, $encrypted] = $parts;
        return openssl_decrypt($encrypted, ENCRYPTION_METHOD, ENCRYPTION_KEY, 0, $iv) ?: '';
    }
}
ENCEOF

echo -e "  ${GREEN}Encryption.php${NC}"

# Buyuk dosyalari base64 ile olustur (heredoc $ ve ! sorunlarini onlemek icin)
echo -e "  ${YELLOW}Buyuk dosyalar base64 ile olusturuluyor...${NC}"

# Auth.php, TelegramNotifier.php, EmailNotifier.php, API dosyalari, agent'lar, dashboard
# Bunlari tar arsivinden cikarmak daha guvenli

# =====================================================
# 4. TAR ARSIVINDEN KOPYALA
# =====================================================
# Eger tar arsivi mevcutsa ondan kopyala
TAR_FILE=""
for f in /home/teknolojikyaz/noc-teknolojik-tr-v1.1.0-ready.tar.gz /tmp/noc-teknolojik-tr-v1.1.0-ready.tar.gz /root/noc-teknolojik-tr-v1.1.0-ready.tar.gz; do
    if [ -f "$f" ]; then
        TAR_FILE="$f"
        break
    fi
done

if [ -n "$TAR_FILE" ]; then
    echo -e "  ${GREEN}Tar arsivi bulundu: $TAR_FILE${NC}"
    echo -e "  ${YELLOW}Dosyalar cikariliyor...${NC}"
    tar -xzf "$TAR_FILE" -C "$INSTALL_DIR"
    # Config'i tekrar yaz (guncel bilgilerle)
    cat > "$INSTALL_DIR/includes/config.php" << 'CONFIGEOF2'
<?php
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../logs/error.log');
date_default_timezone_set('Europe/Istanbul');

define('DB_HOST', 'localhost');
define('DB_NAME', 'teknolojikyaz_noc');
define('DB_USER', 'teknolojikyaz_noc');
define('DB_PASS', 'hDs=+h7(~hH7?kDs');
define('DB_CHARSET', 'utf8mb4');

define('APP_NAME', 'NOC Monitor');
define('APP_VERSION', '1.1.0');
define('APP_URL', 'https://noc.teknolojik.tr');
define('APP_ROOT', dirname(__DIR__));

define('SESSION_NAME', 'noc_session');
define('SESSION_LIFETIME', 86400);
define('JWT_SECRET', '06a56f34e63ecefa0dad65f71b9e2d07602467e21555ba4f92143789edf65eb8');
define('TOKEN_EXPIRY', 86400);
define('AGENT_HEARTBEAT_TIMEOUT', 180);
define('AGENT_SECRET_PREFIX', 'noc_agent_');
define('ENCRYPTION_KEY', 'ac9013e7acc4fec7e665c782f057ef79');
define('ENCRYPTION_METHOD', 'aes-256-cbc');

define('SMTP_HOST', 'mail.teknolojikyazilim.com');
define('SMTP_PORT', 465);
define('SMTP_SECURE', 'ssl');
define('SMTP_USER', 'noc@teknolojik.tr');
define('SMTP_PASS', '');
define('SMTP_FROM_NAME', 'NOC Monitor');

define('TELEGRAM_BOT_TOKEN', '');
define('TELEGRAM_API_URL', 'https://api.telegram.org/bot');

define('LOG_DIR', APP_ROOT . '/logs');
define('CACHE_DIR', APP_ROOT . '/cache');
define('UPLOAD_DIR', APP_ROOT . '/uploads');

define('MAX_LOGIN_ATTEMPTS', 5);
define('LOGIN_LOCKOUT_MINUTES', 15);
define('API_RATE_LIMIT', 100);
define('DATA_RETENTION_DAYS', 90);
define('DEFAULT_PING_INTERVAL', 60);
define('DEFAULT_SNMP_INTERVAL', 300);
define('ALERT_COOLDOWN', 300);
define('PHP_BINARY', '/opt/cpanel/ea-php81/root/usr/bin/php');
CONFIGEOF2
    echo -e "  ${GREEN}Tum dosyalar cikarildi ve config guncellendi${NC}"
else
    echo -e "  ${RED}UYARI: Tar arsivi bulunamadi!${NC}"
    echo -e "  ${YELLOW}Lutfen noc-teknolojik-tr-v1.1.0-ready.tar.gz dosyasini${NC}"
    echo -e "  ${YELLOW}asagidaki konumlardan birine yukleyin:${NC}"
    echo -e "  ${CYAN}  /home/teknolojikyaz/${NC}"
    echo -e "  ${CYAN}  /tmp/${NC}"
    echo -e "  ${CYAN}  /root/${NC}"
    echo -e "  ${YELLOW}Sonra bu scripti tekrar calistirin.${NC}"
    exit 1
fi

# =====================================================
# 5. VERITABANI TABLOLARINI OLUSTUR
# =====================================================
echo -e "${YELLOW}[5/8] Veritabani tablolari olusturuluyor...${NC}"

if [ -f "$INSTALL_DIR/database/schema.sql" ]; then
    mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$INSTALL_DIR/database/schema.sql" 2>/dev/null
    TABLE_COUNT=$(mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME'" -sN 2>/dev/null)
    echo -e "  ${GREEN}$TABLE_COUNT tablo olusturuldu${NC}"
else
    echo -e "  ${RED}schema.sql bulunamadi!${NC}"
    exit 1
fi

# =====================================================
# 6. DOSYA IZINLERI
# =====================================================
echo -e "${YELLOW}[6/8] Dosya izinleri ayarlaniyor...${NC}"

chown -R "$CPANEL_USER:$CPANEL_USER" "$INSTALL_DIR"
find "$INSTALL_DIR" -type d -exec chmod 755 {} \;
find "$INSTALL_DIR" -type f -exec chmod 644 {} \;
chmod 600 "$INSTALL_DIR/includes/config.php"
chmod +x "$INSTALL_DIR/agent/linux/noc-agent.sh"
chmod 755 "$INSTALL_DIR/logs" "$INSTALL_DIR/cache" "$INSTALL_DIR/uploads"

echo -e "  ${GREEN}Izinler ayarlandi${NC}"

# =====================================================
# 7. HTACCESS
# =====================================================
echo -e "${YELLOW}[7/8] .htaccess olusturuluyor...${NC}"

cat > "$INSTALL_DIR/.htaccess" << 'HTEOF'
# NOC Monitor - Apache Config
RewriteEngine On

# HTTPS zorla
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# includes, cron, agent, logs dizinlerine erisimi engelle
RewriteRule ^includes/ - [F,L]
RewriteRule ^cron/ - [F,L]
RewriteRule ^agent/ - [F,L]
RewriteRule ^logs/ - [F,L]
RewriteRule ^cache/ - [F,L]
RewriteRule ^database/ - [F,L]
RewriteRule ^DEVNOTES\.md$ - [F,L]

# Guvenlik headerlari
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

# PHP ayarlari
<IfModule mod_php.c>
    php_value upload_max_filesize 10M
    php_value post_max_size 10M
    php_value max_execution_time 60
    php_value session.cookie_httponly 1
    php_value session.cookie_secure 1
    php_value session.use_strict_mode 1
</IfModule>
HTEOF

# API icin de htaccess
cat > "$INSTALL_DIR/api/.htaccess" << 'APIHTEOF'
# API CORS headerlari
<IfModule mod_headers.c>
    Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    Header always set Access-Control-Allow-Headers "Content-Type, Authorization, X-Agent-Key, X-Agent-Secret, X-API-Token"
</IfModule>

# OPTIONS preflight
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
APIHTEOF

echo -e "  ${GREEN}.htaccess dosyalari olusturuldu${NC}"

# =====================================================
# 8. CRON JOBS
# =====================================================
echo -e "${YELLOW}[8/8] Cron job'lar ayarlaniyor...${NC}"

# Mevcut crontab'i al
CURRENT_CRON=$(crontab -l -u "$CPANEL_USER" 2>/dev/null || echo "")

# NOC cron'lari zaten var mi kontrol et
if echo "$CURRENT_CRON" | grep -q "noc.teknolojik.tr"; then
    echo -e "  ${YELLOW}NOC cron'lari zaten mevcut, atlanıyor${NC}"
else
    # Yeni cron'lari ekle
    NEW_CRONS="
# === NOC Monitor Cron Jobs ===
* * * * * $PHP_BIN $INSTALL_DIR/cron/check_status.php >> /home/$CPANEL_USER/noc-cron.log 2>&1
0 3 * * * $PHP_BIN $INSTALL_DIR/cron/data_retention.php >> /home/$CPANEL_USER/noc-retention.log 2>&1
0 8 * * * $PHP_BIN $INSTALL_DIR/cron/daily_summary.php >> /home/$CPANEL_USER/noc-summary.log 2>&1
# === NOC Monitor END ==="

    echo "$CURRENT_CRON$NEW_CRONS" | crontab -u "$CPANEL_USER" -
    echo -e "  ${GREEN}3 cron job eklendi${NC}"
fi

# =====================================================
# TAMAMLANDI
# =====================================================
echo ""
echo -e "${CYAN}=================================================${NC}"
echo -e "${GREEN}  KURULUM TAMAMLANDI!${NC}"
echo -e "${CYAN}=================================================${NC}"
echo ""
echo -e "  ${CYAN}URL:${NC}        https://noc.teknolojik.tr"
echo -e "  ${CYAN}Kullanici:${NC}  admin"
echo -e "  ${CYAN}Sifre:${NC}     NL2XSG&i9EVkGtJp"
echo ""
echo -e "  ${CYAN}Dizin:${NC}     $INSTALL_DIR"
echo -e "  ${CYAN}DB:${NC}        $DB_NAME"
echo -e "  ${CYAN}Log:${NC}       /home/$CPANEL_USER/noc-cron.log"
echo ""
echo -e "  ${YELLOW}YAPILACAKLAR:${NC}"
echo -e "  1. cPanel'den noc.teknolojik.tr subdomain olustur"
echo -e "  2. SSL sertifikasi al (AutoSSL veya Let's Encrypt)"
echo -e "  3. SMTP sifresini config.php'de ayarla (SMTP_PASS)"
echo -e "  4. Telegram bot token'i ayarla (opsiyonel)"
echo -e "  5. https://noc.teknolojik.tr adresine git ve login ol"
echo ""
echo -e "${CYAN}=================================================${NC}"

# DB baglanti testi
echo -e "${YELLOW}Veritabani baglanti testi...${NC}"
$PHP_BIN -r "
require '$INSTALL_DIR/includes/config.php';
require '$INSTALL_DIR/includes/Database.php';
try {
    \$db = Database::getInstance();
    \$count = Database::fetch('SELECT COUNT(*) as cnt FROM users')['cnt'];
    echo \"  Baglanti basarili! (Users: \$count)\n\";
} catch (Exception \$e) {
    echo \"  HATA: \" . \$e->getMessage() . \"\n\";
}
"

echo ""
echo -e "${GREEN}Kurulum scripti tamamlandi.${NC}"
