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

class BaseAPI {
    protected $user;
    protected $bt_api;
    protected $bt_info;
    protected $site_name;
    
    public function __construct() {
        $this->user = is_user_login();
        if (!$this->user) {
            $this->error('\u8bf7\u5148\u767b\u5f55');
        }
        
        // 调试：输出用户信息类型
        $this->debug_log('用户信息类型: ' . gettype($this->user));
        $this->debug_log('用户信息: ' . print_r($this->user, true));
        
        $this->initBtApi();
        
        // 获取网站ID
        $webid = $this->getWebId();
        
        // 从宝塔API获取真实的网站名称，而不是从数据库用户名构建
        // 这是因为数据库用户名和宝塔网站名称可能不一致
        $this->site_name = $this->bt_api->GetSiteName($webid);
        
        if (empty($this->site_name)) {
            $this->error('无法获取网站名称，请检查网站ID是否正确');
        }
        
        $this->debug_log('从宝塔API获取的网站名称: ' . $this->site_name);
    }
    
    protected function debug_log($message) {
        // 调试日志已禁用
    }
    
    protected function initBtApi() {
        // 调试：输出用户信息
        $this->debug_log('initBtApi用户信息: ' . print_r($this->user, true));
        
        $this->debug_log('initBtApi: Starting initialization.');
        
        // 处理user对象
        if (is_object($this->user)) {
            $btid = isset($this->user->btid) ? $this->user->btid : null;
        } elseif (is_array($this->user)) {
            $btid = isset($this->user['btid']) ? $this->user['btid'] : null;
        } else {
            $this->debug_log('initBtApi: User info format error.');
            $this->error('\u7528\u6237\u4fe1\u606f\u683c\u5f0f\u9519\u8bef');
        }
        
        $this->debug_log('initBtApi: User btid is ' . ($btid ? $btid : 'not set'));
        
        if (!$btid) {
            $this->debug_log('initBtApi: btid is missing.');
            $this->error('\u5b9d\u5854\u670d\u52a1\u5668ID\u4e0d\u5b58\u5728');
        }
        
        $this->bt_info = $GLOBALS['DB']->get_row("SELECT * FROM `bt` WHERE `id`=" . intval($btid));
        
        $this->debug_log('initBtApi: SQL query result: ' . print_r($this->bt_info, true));
        
        if (!$this->bt_info) {
            $this->debug_log('initBtApi: Baota server info not found in database for btid: ' . $btid);
            $this->error('宝塔服务器不存在');
        }
        
        // 调试：输出宝塔服务器信息
        $this->debug_log('initBtApi宝塔服务器信息: ' . print_r($this->bt_info, true));
        
        $this->bt_api = new bt_api();
        
        // 根据安全访问开关动态设置协议
        $protocol = isset($this->bt_info['aqfw']) && $this->bt_info['aqfw'] == 'true' ? 'https' : 'http';
        $this->bt_api->BT_PANEL = $protocol . '://' . $this->bt_info['ip'] . ':' . $this->bt_info['dk'];
        $this->bt_api->BT_KEY = $this->bt_info['key'];
    }
    
    protected function success($data = array()) {
        $response = array('status' => true, 'code' => 'success');
        if (!empty($data)) {
            $response = array_merge($response, $data);
        }
        exit(json_encode($response));
    }
    
    protected function error($message) {
        $debug_msg = date('Y-m-d H:i:s') . ' [error] ' . $message . "\n";
        file_put_contents(__DIR__ . '/error.log', $debug_msg, FILE_APPEND);
        exit(json_encode(array('status' => false, 'code' => $message, 'msg' => $message)));
    }
    
    protected function log($action, $message) {
        $username = isset($this->user->user) ? $this->user->user : (isset($this->user['user']) ? $this->user['user'] : null);
        if (!$username) {
            $this->error('用户名不存在');
        }
        logjl($username, $action, $message, '成功');
    }
    
    protected function getWebId() {
        // 首先尝试使用主域名获取网站ID（支持迁移后自动适配）
        $primary_domain = isset($this->user->primary_domain) ? $this->user->primary_domain : 
                         (isset($this->user['primary_domain']) ? $this->user['primary_domain'] : '');
        
        if (!empty($primary_domain)) {
            $this->debug_log('使用主域名获取网站ID: ' . $primary_domain);
            $webid = $this->bt_api->GetSiteIdByDomain($primary_domain);
            if ($webid > 0) {
                $this->debug_log('通过主域名找到网站ID: ' . $webid);
                return $webid;
            }
            $this->debug_log('主域名未找到对应网站，尝试使用数据库记录的ID');
        }
        
        // 如果主域名找不到，使用数据库记录的webid（兼容旧数据）
        $webid = isset($this->user->webid) ? $this->user->webid : (isset($this->user['webid']) ? $this->user['webid'] : null);
        if (empty($webid)) {
            $this->error('网站ID不存在');
        }
        return $webid;
    }
    
    protected function getConfigPath() {
        return '/www/server/panel/vhost/nginx/' . $this->site_name . '.conf';
    }
    
    /**
     * 重载Nginx配置
     * 修改Nginx配置文件后需要重载才能生效
     */
    protected function reloadNginx() {
        $this->debug_log('reloadNginx: 开始重载Nginx配置');
        
        // 方法1: 尝试使用宝塔的重载API
        $reload_result = $this->bt_api->HttpPostCookie(
            $this->bt_api->BT_PANEL . '/site?action=ReloadServer',
            array_merge($this->bt_api->GetKeyData(), array('type' => 'nginx'))
        );
        
        $decoded = json_decode($reload_result, true);
        $this->debug_log('reloadNginx: ReloadServer结果 - ' . print_r($decoded, true));
        
        // 如果第一个方法失败，尝试第二个方法
        if (!$decoded || !isset($decoded['status']) || $decoded['status'] !== true) {
            $this->debug_log('reloadNginx: ReloadServer失败，尝试ServiceAdmin');
            
            $reload_result2 = $this->bt_api->HttpPostCookie(
                $this->bt_api->BT_PANEL . '/system?action=ServiceAdmin',
                array_merge($this->bt_api->GetKeyData(), array(
                    'name' => 'nginx',
                    'type' => 'reload'
                ))
            );
            
            $decoded2 = json_decode($reload_result2, true);
            $this->debug_log('reloadNginx: ServiceAdmin结果 - ' . print_r($decoded2, true));
        }
        
        // 注意：即使API调用失败，Nginx通常也会在下次请求时自动重载配置
        // 所以这里不抛出错误，只记录日志
        $this->debug_log('reloadNginx: 完成');
    }
    
    protected function getFileContent($path) {
        $result = $this->bt_api->GetFileContent($path);
        if (!$result || !isset($result['status']) || ($result['status'] !== true && $result['status'] !== 'true' && $result['status'] !== 1)) {
            $this->error('获取文件内容失败');
        }
        return isset($result['data']) ? $result['data'] : '';
    }
    
    protected function saveFile($content, $path) {
        $result = $this->bt_api->setwj($content, $path);
        if (!$result || !isset($result['status']) || ($result['status'] !== true && $result['status'] !== 'true' && $result['status'] !== 1)) {
            $this->error('保存文件失败');
        }
        return true;
    }
    
    // 缓存相关方法
    protected function getCacheDir() {
        // 优先使用系统临时目录，确保在虚拟空间下也能正常写入
        $tmp_dir = @sys_get_temp_dir();
        $cache_dir = '';
        
        if ($tmp_dir && @is_writable($tmp_dir)) {
            $cache_dir = $tmp_dir . '/bt_host_cache';
        } else {
            $cache_dir = __DIR__ . '/../../cache';
        }
        
        if (!@is_dir($cache_dir)) {
            @mkdir($cache_dir, 0755, true);
        }
        
        // 如果最终确定的目录还是不可写，尝试使用当前目录下的一个临时目录
        if (!@is_writable($cache_dir)) {
            $cache_dir = __DIR__ . '/cache_tmp';
            if (!@is_dir($cache_dir)) {
                @mkdir($cache_dir, 0755, true);
            }
        }
        
        return $cache_dir;
    }
    
    protected function getCacheFilePath($key) {
        $cache_dir = $this->getCacheDir();
        return $cache_dir . '/' . md5($key) . '.cache';
    }
    
    protected function getCache($key, $expire = 300) {
        $file = $this->getCacheFilePath($key);
        if (!@file_exists($file)) {
            return false;
        }
        
        $data = @file_get_contents($file);
        if ($data === false) return false;
        
        $data = json_decode($data, true);
        
        if (!$data || !isset($data['timestamp']) || !isset($data['data'])) {
            return false;
        }
        
        if (time() - $data['timestamp'] > $expire) {
            @unlink($file);
            return false;
        }
        
        return $data['data'];
    }
    
    protected function setCache($key, $data) {
        $file = $this->getCacheFilePath($key);
        $cache_data = array(
            'timestamp' => time(),
            'data' => $data
        );
        
        // 确保目录存在
        $dir = dirname($file);
        if (!@is_dir($dir)) {
            @mkdir($dir, 0755, true);
        }
        
        if (@is_writable($dir) || (@file_exists($file) && @is_writable($file))) {
            $result = @file_put_contents($file, json_encode($cache_data));
            return $result !== false;
        }
        return false;
    }
    
    protected function deleteCache($key) {
        $file = $this->getCacheFilePath($key);
        if (@file_exists($file)) {
            return @unlink($file);
        }
        return true;
    }
}
?>