use reqwest::{
    header::{HeaderMap, HeaderValue},
    Client,
};

const PEOPLE: [&'static str; 50] = [
    "l3gacyb3ta",
    "sarthaktexas",
    "tetraoxygen",
    "aidenybai",
    "willdoescode",
    "Hugoyhu",
    "anirudhb",
    "abbyfischler",
    "benaubin",
    "ClaireBookworm",
    "jasonappah",
    "gleich",
    "nunu2021",
    "DamianRMusk",
    "sporeball",
    "eilla1",
    "rpalakkal",
    "lavanya-sharma",
    "thatrobotdev",
    "bykevinyang",
    "quackduck",
    "mfarberbrodsky",
    "bashbaugh",
    "merlin04",
    "cole-wilson",
    "YodaLightsabr",
    "kognise",
    "neelr",
    "LinusS1",
    "yeetyah1030",
    "profsucrose",
    "bellesea",
    "kunalbotla",
    "bjmoonn",
    "rbccawang",
    "hogrider321",
    "arianna-m",
    "Robertrover811",
    "pranavnt",
    "rishadjhangiani",
    "swarnya246",
    "rishiosaur",
    "drakontas",
    "zachlatta",
    "maxwofford",
    "MatthewStanciu",
    "christinaasquith",
    "leomcelroy",
    "zfogg",
    "sampoder",
];

#[tokio::main]
async fn main() {
    let token = if let Some(x) = std::env::args().nth(1) {
        x
    } else {
        println!("Please use github token as program argument");
        std::process::exit(1);
    };

    let mut headers = HeaderMap::new();
    headers.insert(
        reqwest::header::AUTHORIZATION,
        HeaderValue::from_str(format!("token {}", token).as_str()).unwrap(),
    );
    headers.insert(
        reqwest::header::USER_AGENT,
        HeaderValue::from_str("terminal").unwrap(),
    );

    headers.insert(
        reqwest::header::ACCEPT,
        HeaderValue::from_str("application/vnd.github.v3+json").unwrap(),
    );

    let tasks: Vec<_> = PEOPLE
        .iter()
        .map(&|person| {
            let headers = headers.clone();
            tokio::spawn(async move {
                let client = Client::builder().default_headers(headers).build().unwrap();
                client
                    .put(format!("https://api.github.com/user/following/{}", person))
                    .send()
                    .await
            })
        })
        .collect();

    let mut items = vec![];

    for task in tasks {
        items.push(task.await.unwrap());
    }

    for (index, item) in items.iter().enumerate() {
        match item {
            Ok(_) => println!("Followed: {}", PEOPLE[index]),
            Err(e) => println!("Error: {}", e),
        }
    }
}