use image::open;
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Открываем изображение
    let img = open(&Path::new("super_easy_secret.png"))?.to_rgb8();

    // Извлекаем ровно 160 битов из красного канала (20 символов)
    let mut bits = Vec::new();
    for pixel in img.pixels().take(160) {
        let lsb = pixel[0] & 1; // LSB красного канала
        bits.push(lsb);
    }

    // Проверяем количество битов
    if bits.len() < 160 {
        return Err("Недостаточно битов для флага".into());
    }

    // Собираем биты в байты
    let mut bytes = Vec::new();
    for chunk in bits[..160].chunks(8) {
        if chunk.len() == 8 {
            let mut byte = 0u8;
            for (i, &bit) in chunk.iter().enumerate() {
                byte |= bit << (7 - i);
            }
            bytes.push(byte);
        }
    }

    // Проверяем количество байтов
    if bytes.len() < 20 {
        return Err("Недостаточно байтов для флага".into());
    }

    // Берем первые 20 байт (длина флага)
    let flag = String::from_utf8_lossy(&bytes[..20]);
    println!("Flag: {}", flag);

    Ok(())
}