Documentation
use std::{env, fs::File, io::{self, BufRead, BufReader}};
use colored::{control::set_override, *};

fn highlight(line: &str, query: &str) -> String {
    let lower_line = line.to_lowercase();
    let lower_query = query.to_lowercase();

    let mut result = String::new();
    let mut i = 0;

    while i < line.len() {
        if lower_line[i..].starts_with(&lower_query) {
            let original = &line[i..i + query.len()];

            result.push_str(&original.red().to_string());

            i += query.len();
        } else {
            result.push(line[i..].chars().next().unwrap());
            i += 1;
        }
    }

    result
}

fn main() -> io::Result<()>{
    let args: Vec<String> = env::args().collect();
    set_override(true);
    if args.len() < 2 {
        eprintln!("Usage: {} <query> [filename]",args[0]);
        eprintln!("IF no filename is provided, reads from stdin");
        return Ok(());
    }

    let query = &args[1];
    if let Some(file_name) = args.get(2) {
        let file = File::open(file_name)?;
        let reader = BufReader::new(file);
        for line in reader.lines() {
            let line = line?;
             if line.to_lowercase().contains(query){
                let highlighted = highlight(&line, query);
                println!("{}", highlighted);
             }
        }
    } else {
        let stdin = io::stdin();
        for line in stdin.lines(){
            let line = line?;
            if line.to_lowercase().contains(query){
                let highlighted = highlight(&line, query);
                println!("{}", highlighted);
            }
        }
    }
    Ok(())
}