<?php
/**
 * Musikbibliothek: Einträge in der DB (Tabelle musik).
 */
if (!defined('FUNCTIONS_ROOT')) {
    return;
}

/**
 * Alle Songs aus der DB (mit Albumname aus alben oder legacy album-Spalte). Toleriert fehlende alben/album_id (Migration 009).
 * @return array<int, array{id: int, dateiname: string, titel: string|null, album_id: int|null, album: string|null, groesse: int, erstellt_am: string}>
 */
function function_musik_alle(): array {
    $pdo = $GLOBALS['pdo'] ?? null;
    if (!$pdo) return [];
    try {
        $sql = "SELECT m.id, m.dateiname, m.titel, m.album_id, COALESCE(a.name, m.album) AS album, m.groesse, m.erstellt_am
                FROM musik m LEFT JOIN alben a ON m.album_id = a.id
                ORDER BY a.name ASC, m.titel ASC, m.erstellt_am DESC";
        $stmt = $pdo->query($sql);
        if ($stmt) return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } catch (Throwable $e) {
        try {
            $stmt = $pdo->query("SELECT id, dateiname, titel, groesse, erstellt_am FROM musik ORDER BY erstellt_am DESC");
            if (!$stmt) return [];
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach ($rows as &$r) { $r['album_id'] = null; $r['album'] = isset($r['album']) ? $r['album'] : null; }
            return $rows;
        } catch (Throwable $e2) {
            return [];
        }
    }
    return [];
}

/**
 * Einen Song eintragen (nach Upload). album_id = Zuordnung zu einem Album.
 */
function function_musik_einfuegen(string $dateiname, int $groesse, ?string $titel = null, ?int $album_id = null): bool {
    $pdo = $GLOBALS['pdo'] ?? null;
    if (!$pdo) return false;
    $sql = "INSERT INTO musik (dateiname, titel, album_id, groesse) VALUES (:dateiname, :titel, :album_id, :groesse)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        'dateiname' => $dateiname,
        'titel'     => $titel,
        'album_id'  => $album_id > 0 ? $album_id : null,
        'groesse'   => $groesse,
    ]);
    return $stmt->rowCount() > 0;
}

/**
 * Titel und/oder Album eines Songs aktualisieren. album_id = null für „kein Album“.
 */
function function_musik_aktualisieren(int $id, ?string $titel = null, ?int $album_id = null): bool {
    $pdo = $GLOBALS['pdo'] ?? null;
    if (!$pdo) return false;
    $updates = [];
    $params = ['id' => $id];
    if ($titel !== null) {
        $updates[] = 'titel = :titel';
        $params['titel'] = $titel;
    }
    if ($album_id !== null) {
        $updates[] = 'album_id = :album_id';
        $params['album_id'] = $album_id > 0 ? $album_id : null;
    }
    if (empty($updates)) return true;
    $sql = "UPDATE musik SET " . implode(', ', $updates) . " WHERE id = :id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    return $stmt->rowCount() >= 0;
}

/**
 * Song anhand Dateiname löschen (DB-Eintrag).
 */
function function_musik_loeschen_nach_dateiname(string $dateiname): bool {
    $pdo = $GLOBALS['pdo'] ?? null;
    if (!$pdo) return false;
    $stmt = $pdo->prepare("DELETE FROM musik WHERE dateiname = :dateiname");
    $stmt->execute(['dateiname' => $dateiname]);
    return $stmt->rowCount() > 0;
}
