<?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';
require_once dirname(__DIR__) . '/includes/layout.php';
requirePermission('duplicates_manage');

$pdo = getDBConnection();
$groups = [];
$seen = [];
$message = trim((string)($_GET['message'] ?? ''));
$status = trim((string)($_GET['status'] ?? 'success'));
$activeSongWhere = 'is_missing = 0 AND COALESCE(is_hidden, 0) = 0';
$criteria = [
    'hash' => [
        'label' => '같은 파일 해시',
        'sql' => "SELECT file_hash AS group_key, COUNT(*) AS cnt FROM songs WHERE $activeSongWhere AND file_hash IS NOT NULL AND file_hash != '' GROUP BY file_hash HAVING cnt > 1 LIMIT 20",
        'where' => 's.file_hash = :group_key',
    ],
    'size_title_artist' => [
        'label' => '같은 크기 + 제목 + 아티스트',
        'sql' => "SELECT CONCAT(file_size, '||', COALESCE(title,''), '||', COALESCE(artist,'')) AS group_key, COUNT(*) AS cnt FROM songs WHERE $activeSongWhere AND file_size > 0 AND title IS NOT NULL AND title != '' GROUP BY group_key HAVING cnt > 1 LIMIT 20",
        'where' => "CONCAT(s.file_size, '||', COALESCE(s.title,''), '||', COALESCE(s.artist,'')) = :group_key",
    ],
    'title_artist_duration' => [
        'label' => '같은 제목 + 아티스트 + 재생시간',
        'sql' => "SELECT CONCAT(COALESCE(title,''), '||', COALESCE(artist,''), '||', COALESCE(duration,0)) AS group_key, COUNT(*) AS cnt FROM songs WHERE $activeSongWhere AND title IS NOT NULL AND title != '' AND duration > 0 GROUP BY group_key HAVING cnt > 1 LIMIT 20",
        'where' => "CONCAT(COALESCE(s.title,''), '||', COALESCE(s.artist,''), '||', COALESCE(s.duration,0)) = :group_key",
    ],
    'filename' => [
        'label' => '같은 파일명',
        'sql' => "SELECT SUBSTRING_INDEX(REPLACE(file_path, '\\\\', '/'), '/', -1) AS group_key, COUNT(*) AS cnt FROM songs WHERE $activeSongWhere GROUP BY group_key HAVING cnt > 1 LIMIT 20",
        'where' => "SUBSTRING_INDEX(REPLACE(s.file_path, '\\\\', '/'), '/', -1) = :group_key",
    ],
];

foreach ($criteria as $type => $criterion) {
    foreach ($pdo->query($criterion['sql'])->fetchAll() as $row) {
        $groupKey = (string)$row['group_key'];
        if ($groupKey === '') continue;
        $seenKey = $type . '|' . $groupKey;
        if (isset($seen[$seenKey])) continue;
        $seen[$seenKey] = true;

        $stmt = $pdo->prepare(baseSongSelectSql() . " WHERE s.is_missing = 0 AND COALESCE(s.is_hidden, 0) = 0 AND " . $criterion['where'] . " ORDER BY s.folder_name ASC, s.title ASC LIMIT 30");
        $stmt->execute([':group_key' => $groupKey]);
        $songs = $stmt->fetchAll();
        if (count($songs) > 1) {
            $groups[] = [
                'type' => $criterion['label'],
                'count' => count($songs),
                'songs' => $songs,
            ];
        }
    }
}

renderHeader('중복곡 관리', 'duplicates');
?>
<div class="admin-dashboard duplicates-page">
    <div class="page-title-section">
        <h1 class="page-main-title">중복곡 관리</h1>
        <p class="page-subtitle">같은 파일이거나 같은 곡으로 보이는 항목을 확인하고, 대표곡 병합 / 숨김 / DB 삭제로 정리합니다. 실제 음악 파일은 삭제하지 않습니다.</p>
    </div>

    <?php if ($message !== ''): ?>
        <div class="alert-box <?php echo $status === 'error' ? 'alert-danger' : 'alert-info'; ?>">
            <div class="alert-icon"><i class="fas fa-circle-info"></i></div>
            <div class="alert-content"><p><?php echo h($message); ?></p></div>
        </div>
    <?php endif; ?>

    <section class="settings-card duplicate-guide-card">
        <h2 class="section-title">정리 기준</h2>
        <div class="duplicate-guide-grid">
            <div><strong>대표곡 병합</strong><span>선택한 대표곡으로 재생기록, 플레이리스트, 좋아요, 태그, 가사/메모/별점을 옮기고 나머지 DB 레코드를 제거합니다.</span></div>
            <div><strong>선택 숨김</strong><span>일반 목록에서만 숨깁니다. 되돌릴 가능성이 있으면 삭제보다 먼저 사용하세요.</span></div>
            <div><strong>선택 DB 삭제</strong><span>곡 DB 레코드와 연결 데이터만 삭제합니다. D드라이브 원본 파일은 삭제하지 않습니다.</span></div>
            <div><strong>선택 원본 파일 삭제</strong><span>관리자가 직접 확인한 중복 파일만 삭제합니다. 대표곡은 체크 해제해야 하며, 실제 음악 파일과 DB 레코드가 함께 정리됩니다.</span></div>
        </div>
    </section>

    <?php if (empty($groups)): ?>
        <section class="home-section"><p class="empty-text">중복 의심 그룹이 없습니다.</p></section>
    <?php else: ?>
        <?php foreach ($groups as $group): ?>
            <section class="home-section duplicate-group">
                <div class="section-heading-row">
                    <h2 class="section-title"><?php echo h($group['type']); ?> · <?php echo number_format($group['count']); ?>곡</h2>
                </div>
                <form action="duplicate_action.php" method="POST" class="duplicate-manage-form">
                    <?php echo csrfInput(); ?>
                    <div class="duplicate-actions">
                        <div class="duplicate-action-help">
                            <span class="settings-muted">대표곡 1개와 정리할 곡을 선택하세요. 기본으로 첫 곡은 대표곡으로 남기고 나머지만 정리 대상으로 선택됩니다.</span>
                        </div>
                        <div class="duplicate-action-primary">
                            <button type="submit" name="action" value="merge_selected" class="btn btn-primary btn-sm" onclick="return confirm('대표곡 기준으로 선택한 중복곡을 병합할까요? 병합된 중복 DB 레코드는 제거되며 실제 음악 파일은 삭제하지 않습니다.');"><i class="fa-solid fa-code-merge"></i> 대표곡으로 병합</button>
                            <button type="submit" name="action" value="hide_selected" class="btn btn-secondary btn-sm" onclick="return confirm('선택한 곡을 일반 목록에서 숨길까요?');"><i class="fa-solid fa-eye-slash"></i> 선택 숨김</button>
                            <button type="submit" name="action" value="delete_selected" class="btn btn-danger btn-sm" onclick="return confirm('선택한 중복 후보를 DB에서 삭제할까요? 가사, 좋아요, 재생기록, 플레이리스트 연결도 정리됩니다. 실제 음악 파일은 삭제하지 않습니다.');"><i class="fa-solid fa-trash-can"></i> 선택 DB 삭제</button>
                        </div>
                        <div class="duplicate-action-danger" aria-label="원본 파일 삭제 작업">
                            <label class="duplicate-file-delete-confirm">
                                <span>원본 삭제 확인</span>
                                <input type="text" name="confirm_phrase" placeholder="파일삭제" autocomplete="off">
                            </label>
                            <button type="submit" name="action" value="delete_files_selected" class="btn btn-danger btn-sm duplicate-file-delete-btn" onclick="return confirm('선택한 중복 후보의 실제 원본 음악 파일을 삭제할까요? 이 작업은 되돌릴 수 없습니다. 대표곡이 정리 대상에 체크되어 있으면 실행되지 않습니다.');"><i class="fa-solid fa-file-circle-xmark"></i> 선택 원본 파일 삭제</button>
                        </div>
                    </div>
                    <div class="table-container duplicate-table-container">
                        <table class="data-table duplicate-table">
                            <thead>
                                <tr>
                                    <th>대표</th>
                                    <th>정리</th>
                                    <th>곡</th>
                                    <th>아티스트</th>
                                    <th>앨범</th>
                                    <th>시간</th>
                                    <th>재생 수</th>
                                    <th>관리</th>
                                </tr>
                            </thead>
                            <tbody>
                                <?php foreach ($group['songs'] as $idx => $song): ?>
                                    <tr>
                                        <td class="text-center">
                                            <input type="radio" name="keep_id" value="<?php echo h($song['id']); ?>" <?php echo $idx === 0 ? 'checked' : ''; ?> aria-label="대표곡 선택">
                                        </td>
                                        <td class="text-center">
                                            <input type="checkbox" name="song_ids[]" value="<?php echo h($song['id']); ?>" <?php echo $idx === 0 ? '' : 'checked'; ?> aria-label="정리 대상 선택">
                                        </td>
                                        <td>
                                            <div class="duplicate-song-cell">
                                                <img src="<?php echo h(coverUrl($song)); ?>" alt="" loading="lazy">
                                                <div>
                                                    <a class="song-title-link" href="../song.php?id=<?php echo h($song['id']); ?>"><?php echo h(metaValue($song['title'], '제목 없음')); ?></a>
                                                    <small>#<?php echo h($song['id']); ?> · <?php echo h(strtoupper($song['extension'] ?? '-')); ?></small>
                                                </div>
                                            </div>
                                        </td>
                                        <td><?php echo h(metaValue($song['artist'], '-')); ?></td>
                                        <td><?php echo h(metaValue($song['album'], '-')); ?></td>
                                        <td><?php echo h(formatDuration((int)($song['duration'] ?? 0))); ?></td>
                                        <td><?php echo number_format((int)($song['play_count'] ?? 0)); ?></td>
                                        <td>
                                            <div class="song-action-group">
                                                <button type="button" class="play-track btn btn-secondary btn-sm" data-track='<?php echo h(json_encode(songClientPayload($song), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); ?>'><i class="fa-solid fa-play"></i> 재생</button>
                                                <a class="btn btn-secondary btn-sm" href="../song.php?id=<?php echo h($song['id']); ?>">상세</a>
                                                <a class="btn btn-secondary btn-sm" href="../song_edit.php?id=<?php echo h($song['id']); ?>">수정</a>
                                            </div>
                                        </td>
                                    </tr>
                                <?php endforeach; ?>
                            </tbody>
                        </table>
                    </div>
                </form>
            </section>
        <?php endforeach; ?>
    <?php endif; ?>
</div>
<?php renderFooter(); ?>
