<?php
/**
 * 到期自动删除脚本
 * 定时任务：每天凌晨2点执行，检查并删除已暂停超过指定天数的主机
 * 
 * 使用方法：
 * 1. 手动执行：php cron/auto_delete_expired.php
 * 2. 宝塔定时任务：每天凌晨2点执行
 */

require_once __DIR__ . '/../MPHX/common.php';

$today = date('Y-m-d');
$now = date('Y-m-d H:i:s');

echo "[{$now}] 开始检查需要删除的过期主机...\n";

// 获取设置
$settings = array();
$result = $DB->query("SELECT * FROM `expire_settings`");
while ($row = $DB->fetch($result)) {
    $settings[$row['setting_key']] = $row['setting_value'];
}

$auto_delete_enabled = intval($settings['auto_delete_enabled'] ?? 1);
$pause_delete_days = intval($settings['pause_delete_days'] ?? 7);
$delete_notify_days = intval($settings['delete_notify_days'] ?? 3);

// 检查是否启用自动删除
if (!$auto_delete_enabled) {
    echo "[{$now}] 自动删除功能已禁用，跳过执行\n";
    exit(0);
}

// 计算删除截止日期（暂停超过指定天数的）
$delete_deadline = date('Y-m-d', strtotime("-{$pause_delete_days} days"));

// 计算通知日期（即将在指定天数内删除的）
$notify_date = date('Y-m-d', strtotime("+{$delete_notify_days} days", strtotime($delete_deadline)));

$deleted_count = 0;
$error_count = 0;
$notified_count = 0;

// 1. 发送删除前通知
if ($delete_notify_days > 0) {
    $notify_users = $DB->query("SELECT * FROM `zj` WHERE `zt`='已过期' AND `dqsj` != '' AND `dqsj` <= '{$notify_date}' AND `dqsj` > '{$delete_deadline}' AND `delete_notify_sent` != 1");
    
    while ($user = $DB->fetch($notify_users)) {
        $username = $user['user'];
        $delete_date = date('Y-m-d', strtotime($user['dqsj'] . " +{$pause_delete_days} days"));
        $days_until_delete = ceil((strtotime($delete_date) - strtotime($today)) / (60 * 60 * 24));
        
        // 发送通知
        $title = "主机即将被删除警告";
        $content = "您的主机已暂停超过 {$pause_delete_days} 天，将在 {$days_until_delete} 天后（{$delete_date}）被自动删除，包括网站、数据库和FTP数据。请及时续费以避免数据丢失！";
        
        $DB->query("INSERT INTO `notifications` (`user_id`,`type`,`title`,`content`,`is_read`,`create_time`) VALUES ('{$user['id']}','delete_warning','{$title}','{$content}',0,NOW())");
        $DB->query("UPDATE `zj` SET `delete_notify_sent`=1 WHERE `id`='{$user['id']}'");
        
        echo "[{$now}] 通知: 用户 {$username} 将在 {$days_until_delete} 天后被删除\n";
        $notified_count++;
    }
}

// 2. 删除已暂停超过指定天数的主机
$expired_users = $DB->query("SELECT * FROM `zj` WHERE `zt`='已过期' AND `dqsj` != '' AND `dqsj` <= '{$delete_deadline}'");

while ($user = $DB->fetch($expired_users)) {
    $username = $user['user'];
    $webid = $user['webid'];
    $btid = $user['btid'];
    $sqlname = $user['sqlname'] ?? '';
    
    echo "[{$now}] 处理删除: 用户 {$username}, 到期时间: {$user['dqsj']}\n";
    
    // 获取宝塔服务器信息
    $bt = intval($btid);
    $bt = $DB->get_row("SELECT * FROM `bt` WHERE `id`='{$btid_escaped}'");
    if (!$bt) {
        echo "[{$now}] 错误: 用户 {$username} 的宝塔服务器信息不存在\n";
        $error_count++;
        continue;
    }
    
    // 初始化宝塔API
    $protocol = isset($bt['aqfw']) && $bt['aqfw'] == 'true' ? 'https' : 'http';
    $bt_api = new bt_api();
    $bt_api->BT_PANEL = $protocol . '://' . $bt['ip'] . ':' . $bt['dk'];
    $bt_api->BT_KEY = $bt['key'];
    
    $delete_success = true;
    $delete_errors = array();
    
    // 1. 删除网站
    if ($webid) {
        $result = $bt_api->delweb($webid, $username);
        if (!$result || (isset($result['status']) && $result['status'] !== true && $result['status'] !== 'true')) {
            $error_msg = isset($result['msg']) ? $result['msg'] : '删除网站失败';
            echo "[{$now}] 警告: 用户 {$username} 删除网站失败 - {$error_msg}\n";
            $delete_errors[] = "网站: {$error_msg}";
            // 继续执行，不中断
        } else {
            echo "[{$now}] 成功: 用户 {$username} 的网站已删除\n";
        }
    }
    
    // 2. 删除数据库
    if ($sqlname) {
        $result = $bt_api->delsql($sqlname);
        if (!$result || (isset($result['status']) && $result['status'] !== true && $result['status'] !== 'true')) {
            $error_msg = isset($result['msg']) ? $result['msg'] : '删除数据库失败';
            echo "[{$now}] 警告: 用户 {$username} 删除数据库失败 - {$error_msg}\n";
            $delete_errors[] = "数据库: {$error_msg}";
        } else {
            echo "[{$now}] 成功: 用户 {$username} 的数据库已删除\n";
        }
    }
    
    // 3. 删除FTP
    $ftp_result = $bt_api->delftp($username);
    if (!$ftp_result || (isset($ftp_result['status']) && $ftp_result['status'] !== true && $ftp_result['status'] !== 'true')) {
        $error_msg = isset($ftp_result['msg']) ? $ftp_result['msg'] : '删除FTP失败';
        echo "[{$now}] 警告: 用户 {$username} 删除FTP失败 - {$error_msg}\n";
        $delete_errors[] = "FTP: {$error_msg}";
    } else {
        echo "[{$now}] 成功: 用户 {$username} 的FTP已删除\n";
    }
    
    // 4. 删除用户数据目录
    $user_dir = '/www/wwwroot/' . $username;
    if (is_dir($user_dir)) {
        // 使用递归删除目录
        $rm_result = recursive_rmdir($user_dir);
        if ($rm_result) {
            echo "[{$now}] 成功: 用户 {$username} 的数据目录已删除\n";
        } else {
            echo "[{$now}] 警告: 用户 {$username} 的数据目录删除失败\n";
            $delete_errors[] = "数据目录删除失败";
        }
    }
    
    // 5. 从数据库删除用户记录
    $DB->query("DELETE FROM `zj` WHERE `id`='{$user['id']}'");
    
    // 6. 发送删除完成通知
    $title = "主机已删除";
    if (count($delete_errors) > 0) {
        $content = "您的主机因长期未续费已被系统自动删除。删除过程中遇到以下问题：" . implode('；', $delete_errors) . "。如有疑问请联系客服。";
    } else {
        $content = "您的主机因长期未续费（暂停超过 {$pause_delete_days} 天）已被系统自动删除，包括网站、数据库和FTP数据。如有疑问请联系客服。";
    }
    
    // 记录日志
    if (count($delete_errors) > 0) {
        logjl($username, '到期自动删除', "主机已删除，但存在问题: " . implode(', ', $delete_errors), false);
        $error_count++;
    } else {
        logjl($username, '到期自动删除', "主机已完全删除", true);
        $deleted_count++;
    }
}

$now = date('Y-m-d H:i:s');
echo "[{$now}] 执行完成: 删除 {$deleted_count} 个主机, 通知 {$notified_count} 个用户, 存在问题 {$error_count} 个\n";

/**
 * 递归删除目录
 */
function recursive_rmdir($dir) {
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object) {
            if ($object != "." && $object != "..") {
                if (is_dir($dir . "/" . $object)) {
                    recursive_rmdir($dir . "/" . $object);
                } else {
                    unlink($dir . "/" . $object);
                }
            }
        }
        return rmdir($dir);
    }
    return false;
}
