<?php
header('Content-Type: application/json; charset=utf-8');

// 允许跨域请求（方便其他网站调用）
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET");

// 数据库连接信息
$servername = "localhost";
$username = "a1sax1m9i";
$password = "a1sax1m9i";
$dbname = "a1sax1m9i";

// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die(json_encode(array(
        "success" => false, 
        "message" => "数据库连接失败: " . $conn->connect_error
    )));
}

// 设置数据库连接字符集
$conn->set_charset("utf8mb4");

// 获取硬编码音乐数据
function getHardcodedMusic() {
    $musicPath = __DIR__ . '/data/music.php';
    
    // 检查文件是否存在
    if (!file_exists($musicPath)) {
        return array(
            "success" => false,
            "message" => "硬编码音乐文件不存在",
            "data" => array()
        );
    }
    
    // 读取硬编码音乐（使用require_once并捕获返回值）
    $hardcodedMusic = require_once $musicPath;
    
    // 验证数据格式
    if (is_array($hardcodedMusic)) {
        return array(
            "success" => true,
            "message" => "成功获取硬编码音乐",
            "data" => $hardcodedMusic
        );
    } else {
        return array(
            "success" => false,
            "message" => "硬编码音乐格式不正确",
            "data" => array()
        );
    }
}

// 从数据库获取音乐
function getDatabaseMusic($conn) {
    $sql = "SELECT id, title, artist, category, mp3, bvid, duration FROM music";
    $result = $conn->query($sql);

    $musicList = array();
    if ($result && $result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $musicList[] = $row;
        }
        return array(
            "success" => true,
            "message" => "成功获取数据库音乐",
            "data" => $musicList
        );
    } else {
        return array(
            "success" => false,
            "message" => "数据库中没有找到音乐数据",
            "data" => array()
        );
    }
}

// 获取所有音乐（合并数据库和硬编码）
function getAllMusic($conn) {
    // 获取两种来源的音乐
    $dbMusic = getDatabaseMusic($conn);
    $hardcodedMusic = getHardcodedMusic();
    
    // 合并音乐列表（去重处理）
    $allMusic = array();
    $ids = array();
    
    // 添加数据库音乐
    foreach ($dbMusic['data'] as $music) {
        $id = $music['id'];
        if (!in_array($id, $ids)) {
            $ids[] = $id;
            $allMusic[] = $music;
        }
    }
    
    // 添加硬编码音乐
    foreach ($hardcodedMusic['data'] as $music) {
        $id = $music['id'];
        if (!in_array($id, $ids)) {
            $ids[] = $id;
            $allMusic[] = $music;
        }
    }
    
    return array(
        "success" => true,
        "message" => "共获取 " . count($allMusic) . " 首音乐（数据库: " . count($dbMusic['data']) . ", 硬编码: " . count($hardcodedMusic['data']) . "）",
        "data" => $allMusic,
        "sources" => array(
            "database" => $dbMusic['success'],
            "hardcoded" => $hardcodedMusic['success']
        )
    );
}

// 获取音乐标签（合并数据库和硬编码）
function getMusicTags($conn) {
    // 获取所有音乐
    $allMusic = getAllMusic($conn);
    $tags = array();
    
    if ($allMusic['success']) {
        foreach ($allMusic['data'] as $music) {
            if (!empty($music['category']) && !in_array($music['category'], $tags)) {
                $tags[] = $music['category'];
            }
        }
    }
    
    return array(
        "success" => !empty($tags),
        "message" => empty($tags) ? "没有找到音乐标签" : "成功获取 " . count($tags) . " 个标签",
        "data" => $tags
    );
}

// 获取音乐地址（同时检查数据库和硬编码）
/**
 * 获取音乐地址（同时检查数据库和硬编码）- 修复版
 * 增加了对 SQL 语句准备失败的检查，避免触发 500 错误。
 */
/**
 * 获取音乐的分享播放URL
 * 直接返回格式为 shanwogou.cn/audio/play.php?play=音乐id 的链接
 */
function getMusicUrl($conn) {
    // 1. 验证输入的音乐ID
    $musicId = $_GET['id'] ?? '';
    if (empty($musicId)) {
        return array(
            "success" => false, 
            "message" => "音乐 ID 不能为空"
        );
    }
    
    // 2. 核心逻辑：检查该ID的音乐是否存在于系统中
    // （我们不再返回真实MP3地址，但需要确认音乐ID是有效的）
    $musicExists = false;
    
    // 2.1 先检查数据库
    $sql = "SELECT id FROM music WHERE id = ?"; // 只需检查ID是否存在
    $stmt = $conn->prepare($sql);
    
    if ($stmt) { // 检查prepare是否成功
        $stmt->bind_param("s", $musicId);
        $stmt->execute();
        $stmt->store_result();
        
        if ($stmt->num_rows > 0) {
            $musicExists = true;
        }
        $stmt->close();
    }
    
    // 2.2 如果数据库中不存在，再检查硬编码文件
    if (!$musicExists) {
        $hardcodedMusic = getHardcodedMusic();
        if ($hardcodedMusic['success']) {
            foreach ($hardcodedMusic['data'] as $music) {
                if ((string)$music['id'] === (string)$musicId) {
                    $musicExists = true;
                    break;
                }
            }
        }
    }
    
    // 3. 根据检查结果返回响应
    if ($musicExists) {
        // 如果音乐存在，生成并返回分享URL
        $shareUrl = "https://shanwogou.cn/audio/play.php?play=" . urlencode($musicId);
        return array(
            "success" => true, 
            "data" => $shareUrl,
            "source" => "share_link" // 标记来源为分享链接
        );
    } else {
        // 如果音乐不存在，返回错误信息
        return array(
            "success" => false, 
            "message" => "没有找到该 ID 的音乐"
        );
    }
}

function getAnnouncements($conn) {
    // 准备SQL查询，从announcements表中获取所有记录，并按ID倒序排列（最新的在前）
    $sql = "SELECT id, nr, time FROM announcements ORDER BY id DESC";
    
    // 执行查询
    $result = $conn->query($sql);

    // 初始化一个空数组来存储公告数据
    $announcementList = array();

    // 检查查询是否成功且有结果
    if ($result && $result->num_rows > 0) {
        // 循环遍历所有结果行
        while ($row = $result->fetch_assoc()) {
            // 将每一行公告数据添加到数组中
            $announcementList[] = $row;
        }
        
        // 返回成功响应，包含公告数据
        return array(
            "success" => true,
            "message" => "成功获取 " . count($announcementList) . " 条公告",
            "data" => $announcementList
        );
    } else {
        // 如果查询失败或没有数据，返回失败响应
        return array(
            "success" => false,
            "message" => "没有找到公告数据或查询失败",
            "data" => array()
        );
    }
}

// 处理请求
// 处理请求
$action = $_GET['action'] ?? '';

switch ($action) {
    case 'getAllMusic':
        $response = getAllMusic($conn);
        break;
    case 'getMusicTags':
        $response = getMusicTags($conn);
        break;
    case 'getMusicUrl':
        $response = getMusicUrl($conn);
        break;
    // --- 新增部分 ---
    case 'getAnnouncements':
        $response = getAnnouncements($conn);
        break;
    // --- 新增结束 ---
    default:
        $response = array(
            "success" => false, 
            "message" => "无效的操作，请使用 action=getAllMusic、getMusicTags、getMusicUrl 或 getAnnouncements"
        );
}

// 输出JSON响应
echo json_encode($response, JSON_UNESCAPED_UNICODE);

// 关闭数据库连接
$conn->close();
?>
