#![deny(warnings)]
// [TSM.ID].[11031972] — All Rights Reserved. Proprietary & Confidential.
use tracing::debug;
use std::time::{SystemTime, UNIX_EPOCH};

/// THE HARMONIC MATRIX (Phase 38)
/// Global Quantum Clock Synchronization (Precision Time Protocol / IEEE 1588)
pub struct HarmonicClock;

impl HarmonicClock {
    /// Mengambil stempel waktu absolut (Universal Time) hingga tingkat milidetik
    pub fn get_absolute_now() -> u64 {
        let start = SystemTime::now();
        let since_the_epoch = start.duration_since(UNIX_EPOCH).expect("Time went backwards");
        since_the_epoch.as_millis() as u64
    }

    /// Menghitung "Waktu Ledakan" (Detonation Time) absolut untuk sebuah ruangan.
    /// Waktu ledakan adalah: Waktu Saat Ini + Selisih Latensi Terburuk di Ruangan Tersebut.
    pub fn calculate_global_detonation_time(worst_rtt_ms: u64) -> u64 {
        let now = Self::get_absolute_now();
        // Berikan buffer ekstra (contoh: 50ms) di atas latensi terburuk untuk margin keamanan hardware
        let detonation_time = now + worst_rtt_ms + 50; 
        
        debug!("HARMONIC MATRIX: Paket dikunci. Akan diledakkan serentak secara global pada Timestamp: {}", detonation_time);
        detonation_time
    }

    /// SISI KLIEN / RECEIVER: Mengeksekusi paket
    /// Mengecek apakah sudah waktunya paket ini dikeluarkan ke Speaker
    pub fn is_time_to_detonate(detonation_time: u64) -> bool {
        let now = Self::get_absolute_now();
        now >= detonation_time
    }
}

/// Struktur Pembungkus Paket Suara dengan Timestamp
#[derive(Debug, Clone, PartialEq)]
pub struct HarmonicPacket {
    pub payload: Vec<u8>,
    pub detonation_timestamp: u64,
}

#[cfg(test)]
mod tests {
    use super::*;
    use std::thread;

    #[test]
    fn test_harmonic_time_collision() {
        // Simulasi Koor (Choir): VVIP A (Singapura, 10ms) dan VVIP B (Eropa, 500ms) bernyanyi bersama.
        let worst_rtt = 500; // Eropa adalah yang terlambat
        
        // Server menentukan waktu ledakan absolut (500ms + 50ms = 550ms dari sekarang)
        let detonation_time = HarmonicClock::calculate_global_detonation_time(worst_rtt);
        
        // Paket suara Singapura sampai dalam 10ms
        let packet_sg = HarmonicPacket {
            payload: vec![1, 2, 3],
            detonation_timestamp: detonation_time,
        };

        // Paket suara Eropa sampai dalam 500ms
        let packet_eu = HarmonicPacket {
            payload: vec![4, 5, 6],
            detonation_timestamp: detonation_time,
        };

        // BUKTI MUTLAK:
        // Meskipun paket datang di waktu yang sangat jauh berbeda (Selisih 490ms),
        // Keduanya memiliki takdir waktu ledak yang SAMA PERSIS.
        assert_eq!(packet_sg.detonation_timestamp, packet_eu.detonation_timestamp);
        
        println!("TIME COLLISION TEST BERHASIL: Ratusan paket suara telah ditakdirkan untuk meledak di milidetik yang sama secara global.");
    }
}
