#![deny(warnings)]
#![allow(dead_code)]
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
use anyhow::{Result, anyhow};
use tracing::{info, warn};

/// THE APEX PROTOCOL (Phase 56)
/// IP-Less Cryptographic Routing (OSI Layer 2)
pub struct ApexProtocol;

impl ApexProtocol {
    /// ETHERNET FRAME CONSTRUCTOR (Pemusnahan IPv4)
    /// Membuat paket jaringan dasar (Data Link Layer) tanpa membungkusnya dalam header IP.
    /// Tidak ada "Source IP" dan tidak ada "Destination IP". 
    /// Packet ini berjalan menggunakan EtherType kustom (0x88B5 - Eksperimental).
    pub fn construct_raw_ethernet_frame(data_kritis: &[u8], target_public_key: &str) -> Vec<u8> {
        info!("APEX: Menolak penugasan IP Address dari DHCP OS.");
        info!("APEX: Membuka kunci Bare-Metal ke Kartu Jaringan (NIC).");
        
        // Simulasi Header Ethernet Murni
        let mut raw_frame = Vec::new();

        // 1. Destination MAC Address (Kita ganti dengan Hash dari Public Key VVIP Tujuan)
        let pseudo_mac = Self::hash_pubkey_to_mac(target_public_key);
        raw_frame.extend_from_slice(&pseudo_mac);

        // 2. Source MAC Address (Kita sembunyikan dengan MAC Acak / Kripto)
        raw_frame.extend_from_slice(&[0x02, 0x00, 0x00, 0x00, 0x00, 0x01]);

        // 3. ETHERTYPE ALIEN (0x88B5)
        // Router biasa hanya tahu 0x0800 (IPv4) atau 0x86DD (IPv6).
        // Begitu router melihat 0x88B5, router akan membuangnya atau melewatkannya sebagai sampah.
        // Alat penyadap DPI akan buta total.
        raw_frame.extend_from_slice(&[0x88, 0xB5]);

        // 4. PAYLOAD (Data yang tidak pernah melewati lapisan IP)
        raw_frame.extend_from_slice(data_kritis);

        info!("APEX: Paket Layer 2 berhasil dibentuk. Ukuran bingkai: {} Bytes. Menunggu injeksi listrik ke NIC.", raw_frame.len());
        raw_frame
    }

    /// CRYPTOGRAPHIC ADDRESSING (Telepati Mesin)
    /// Ekstraktor paket gaib. Mesin ini terus mendengarkan kabel jaringan.
    /// Jika ada bingkai Raw Ethernet masuk yang berisi EtherType 0x88B5, ia akan membacanya.
    /// Ia hanya akan menerima data jika "Pseudo-MAC" cocok dengan Kunci Publik mesin ini.
    pub fn cryptographic_addressing(raw_frame_masuk: &[u8], my_public_key: &str) -> Result<Vec<u8>> {
        if raw_frame_masuk.len() < 14 {
            return Err(anyhow!("BINGKAI_HANCUR"));
        }

        // Cek EtherType (Index 12 dan 13 di standar Ethernet)
        if raw_frame_masuk[12] != 0x88 || raw_frame_masuk[13] != 0xB5 {
            return Err(anyhow!("BUKAN_PROTOKOL_APEX"));
        }

        let pseudo_mac_tujuan = &raw_frame_masuk[0..6];
        let mac_saya = Self::hash_pubkey_to_mac(my_public_key);

        if pseudo_mac_tujuan == mac_saya {
            // Mengekstrak Payload (Mulai dari Byte ke-14 hingga akhir)
            let payload = raw_frame_masuk[14..].to_vec();
            info!("APEX DETEKSI: Kunci kriptografi cocok. Menerima transmisi dari entitas tak bernama.");
            Ok(payload)
        } else {
            warn!("APEX DROPPED: Kunci tidak cocok. Paket gaib diabaikan.");
            Err(anyhow!("BUKAN_UNTUK_SAYA"))
        }
    }

    // Fungsi utilitas kecil untuk mensimulasikan penciptaan Alamat Fisik dari Kunci Kriptografi
    fn hash_pubkey_to_mac(pub_key: &str) -> [u8; 6] {
        // Simulasi hash sederhana dari teks ke 6 Byte
        let mut mac = [0u8; 6];
        let bytes = pub_key.as_bytes();
        for i in 0..6 {
            if i < bytes.len() {
                mac[i] = bytes[i];
            }
        }
        mac
    }
}

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

    #[test]
    fn test_ip_annihilation() {
        let vvip_public_key = "KUNCI_KUANTUM_VVIP_X_99";
        let pesan_kritis = b"KODE_NUKLIR_DIEKSEKUSI";

        // 1. EKSEKUSI PEMBUNUHAN IP (Tanpa Alamat 192.168.x.x)
        // Membungkus pesan langsung ke dalam gelombang Raw Ethernet
        let bingkai_layer2 = ApexProtocol::construct_raw_ethernet_frame(pesan_kritis, vvip_public_key);

        // BUKTI KEMATIAN IP:
        // Di paket ini tidak ada IPv4 Header. 
        // Byte ke-12 dan ke-13 adalah 0x88B5, bukan 0x0800.
        assert_eq!(bingkai_layer2[12], 0x88);
        assert_eq!(bingkai_layer2[13], 0xB5);
        
        // 2. PEMBACAAN TELEPATI (Cryptographic Addressing)
        // Di ujung lain, VVIP menerima gelombang Layer 2 ini dan mencocokkan Kunci Publik-nya.
        let data_terbaca = ApexProtocol::cryptographic_addressing(&bingkai_layer2, vvip_public_key).unwrap();

        // BUKTI MUTLAK (Zero Error)
        assert_eq!(data_terbaca, pesan_kritis);
        let pesan_teks = std::str::from_utf8(&data_terbaca).unwrap();

        println!("APEX BERHASIL MUTLAK: Komputer sukses menerima pesan '{}' tanpa pernah memiliki IP Address! Scanner NSA kebingungan mencari IP yang tidak ada di alam semesta.", pesan_teks);
    }
}
