use crate::Record;
use anyhow::Result;
pub fn guess(rec: &mut Record) -> Result<()> {
if rec.matchup.is_none() {
return Ok(());
}
if rec.instantbuild == Some(true) || rec.enablecheats == Some(true) {
return Ok(());
}
if rec.teams.len() != 2 || rec.teams[0].len() != rec.teams[1].len() {
return Ok(());
}
let mut resigned: Vec<i32> = vec![];
rec.players.iter().for_each(|p| {
if !p.isvalid() {
return;
}
if let Some(idx) = p.index {
if let Some(resign_time) = p.resigned {
if resign_time > 0 {
resigned.push(idx);
}
}
}
});
if resigned.is_empty() {
if let Some(pov) = rec.recorder {
resigned.push(pov as i32);
} else {
return Ok(());
}
}
let winner_team: &Vec<i32>;
if is_subset(&resigned, &rec.teams[0]) {
winner_team = &rec.teams[1];
} else if is_subset(&resigned, &rec.teams[1]) {
winner_team = &rec.teams[0];
} else {
return Ok(());
}
rec.players.iter_mut().for_each(|p| {
if p.index.as_ref().is_some_and(|idx| winner_team.contains(idx)) {
p.winner = Some(true);
} else {
p.winner = Some(false);
}
});
rec.haswinner = true;
Ok(())
}
fn is_subset(sub: &[i32], sup: &[i32]) -> bool {
sub.iter().all(|item| sup.contains(item))
}