<?php
require_once dirname(__DIR__) . '/config/config.php';
require_once dirname(__DIR__) . '/includes/db.php';
require_once dirname(__DIR__) . '/includes/functions.php';
require_once dirname(__DIR__) . '/includes/auth.php';
requirePermission('missing_files_manage');

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Location: missing_files.php?status=error&message=' . urlencode('파일 없음 관리는 POST 방식으로만 실행됩니다.'));
    exit;
}
requireCsrfToken();

try {
    $action = (string)($_POST['action'] ?? '');
    $pdo = getDBConnection();

    if ($action === 'delete_all_missing') {
        // 모든 누락 곡(숨겨지지 않은 곡) ID 조회
        $stmt = $pdo->prepare("SELECT id FROM songs WHERE is_missing = 1");
        $stmt->execute();
        $songs = $stmt->fetchAll(PDO::FETCH_COLUMN);

        if (empty($songs)) {
            throw new Exception('삭제할 누락 곡이 없습니다.');
        }

        $tableExists = function (string $table) use ($pdo): bool {
            $stmt = $pdo->prepare("
                SELECT COUNT(*)
                FROM information_schema.tables
                WHERE table_schema = DATABASE()
                  AND table_name = :table_name
            ");
            $stmt->execute([':table_name' => $table]);
            return (int)$stmt->fetchColumn() > 0;
        };

        $relatedTables = [
            'playlist_songs',
            'liked_songs',
            'play_history',
            'lyrics',
            'track_notes',
            'track_ratings',
            'song_tags',
        ];

        $pdo->beginTransaction();
        try {
            $placeholders = implode(',', array_fill(0, count($songs), '?'));

            foreach ($relatedTables as $table) {
                if (!$tableExists($table)) continue;
                $deleteRelated = $pdo->prepare("DELETE FROM `$table` WHERE song_id IN ($placeholders)");
                $deleteRelated->execute($songs);
            }

            $deleteSongs = $pdo->prepare("DELETE FROM songs WHERE id IN ($placeholders) AND is_missing = 1");
            $deleteSongs->execute($songs);

            $deletedCount = $deleteSongs->rowCount();
            $pdo->commit();
        } catch (Throwable $e) {
            if ($pdo->inTransaction()) $pdo->rollBack();
            throw $e;
        }

        if (function_exists('writeAuditLog')) {
            writeAuditLog('missing_songs_bulk_deleted', '파일 없음 곡 일괄 삭제: ' . $deletedCount . '개 곡 삭제', 'success', 'warning', 'song', 0);
        } elseif (function_exists('logAdminAction')) {
            logAdminAction('missing_songs_bulk_deleted', '파일 없음 곡 일괄 삭제: ' . $deletedCount . '개 곡 삭제');
        }

        $message = '파일 없음 곡 ' . $deletedCount . '개와 연결 데이터를 삭제했습니다. 원본 음악 파일은 삭제하지 않았습니다.';
    } else {
        $songId = (int)($_POST['song_id'] ?? 0);
        if ($songId <= 0) throw new Exception('잘못된 곡 ID입니다.');

        if ($action === 'clear_missing') {
            $stmt = $pdo->prepare("UPDATE songs SET is_missing = 0, missing_checked_at = NOW(), updated_at = NOW() WHERE id = :id");
            $stmt->execute([':id' => $songId]);
            $message = '파일 없음 상태를 해제했습니다. 실제 파일 존재 여부는 다음 스캔에서 다시 확인됩니다.';
    } elseif ($action === 'hide_song') {
        $stmt = $pdo->prepare("UPDATE songs SET is_hidden = 1, updated_at = NOW() WHERE id = :id");
        $stmt->execute([':id' => $songId]);
        $message = '일반 목록에서 숨김 처리했습니다.';
    } elseif ($action === 'delete_missing') {
        $songStmt = $pdo->prepare("
            SELECT id, title, artist, file_path, is_missing
            FROM songs
            WHERE id = :id
            LIMIT 1
        ");
        $songStmt->execute([':id' => $songId]);
        $song = $songStmt->fetch();
        if (!$song) {
            throw new Exception('삭제할 곡을 찾을 수 없습니다.');
        }
        if ((int)($song['is_missing'] ?? 0) !== 1) {
            throw new Exception('파일 없음 상태가 아닌 곡은 이 화면에서 즉시 삭제할 수 없습니다.');
        }

        $filePath = (string)($song['file_path'] ?? '');
        if ($filePath !== '') {
            if (filesystemPathExists($filePath, 'file')) {
                throw new Exception('실제 파일이 다시 확인되었습니다. 삭제 대신 파일 없음 상태 재검사를 실행하세요.');
            }
        }

        $tableExists = function (string $table) use ($pdo): bool {
            $stmt = $pdo->prepare("
                SELECT COUNT(*)
                FROM information_schema.tables
                WHERE table_schema = DATABASE()
                  AND table_name = :table_name
            ");
            $stmt->execute([':table_name' => $table]);
            return (int)$stmt->fetchColumn() > 0;
        };

        $relatedTables = [
            'playlist_songs',
            'liked_songs',
            'play_history',
            'lyrics',
            'track_notes',
            'track_ratings',
            'song_tags',
        ];

        $pdo->beginTransaction();
        try {
            foreach ($relatedTables as $table) {
                if (!$tableExists($table)) continue;
                $deleteRelated = $pdo->prepare("DELETE FROM `$table` WHERE song_id = :song_id");
                $deleteRelated->execute([':song_id' => $songId]);
            }

            $deleteSong = $pdo->prepare("DELETE FROM songs WHERE id = :id AND is_missing = 1");
            $deleteSong->execute([':id' => $songId]);
            if ($deleteSong->rowCount() < 1) {
                throw new Exception('곡 삭제에 실패했습니다. 파일 없음 상태를 다시 확인하세요.');
            }
            $pdo->commit();
        } catch (Throwable $e) {
            if ($pdo->inTransaction()) $pdo->rollBack();
            throw $e;
        }

        $title = trim((string)($song['title'] ?? '제목 없음'));
        $artist = trim((string)($song['artist'] ?? ''));
        if (function_exists('writeAuditLog')) {
            writeAuditLog('missing_song_deleted', '파일 없음 곡 삭제: #' . $songId . ' ' . $title . ($artist !== '' ? ' / ' . $artist : ''), 'success', 'warning', 'song', $songId);
        } elseif (function_exists('logAdminAction')) {
            logAdminAction('missing_song_deleted', '파일 없음 곡 삭제: #' . $songId . ' ' . $title);
        }
        $message = '파일 없음 곡과 연결 데이터를 삭제했습니다. 원본 음악 파일은 삭제하지 않았습니다.';
    } else {
        throw new Exception('알 수 없는 작업입니다.');
    }
    }

    header('Location: missing_files.php?status=success&message=' . urlencode($message));
} catch (Exception $e) {
    header('Location: missing_files.php?status=error&message=' . urlencode($e->getMessage()));
}
exit;
