/*
    Hurry Curry! - a game about cooking
    Copyright (C) 2026 Hurry Curry! Contributors

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, version 3 of the License only.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

*/

use crate::server::{Server, ServerConfig};
use anyhow::{Result, anyhow};
use hurrycurry_protocol::{GameConfig, PacketC};
use std::{path::PathBuf, time::Instant};
use tokio::sync::broadcast;

pub fn benchmark(data_path: PathBuf) -> Result<()> {
    let mut server = Server::new(
        ServerConfig {
            data_path,
            ..Default::default()
        },
        broadcast::channel(1024).0,
    )?;

    server
        .load(GameConfig {
            map: "junior".to_string(),
            bots: vec![
                "simple".to_owned(),
                "dishwasher".to_owned(),
                "waiter".to_string(),
            ],
            ..Default::default()
        })
        .map_err(|e| anyhow!("{e}"))?;

    let start = Instant::now();
    let mut packets = 0;
    let mut packets_movement = 0;
    loop {
        if server.tick(1. / 50.).is_some() {
            break;
        }
        while let Some(p) = server.packet_out.pop_front() {
            packets += 1;
            if let PacketC::Movement { .. } = &p {
                packets_movement += 1;
            }
        }
    }

    println!("points: {}", server.game.score.points);
    println!("simulation took {:?}", start.elapsed());
    println!(
        "packets broadcast: {packets} ({packets_movement} movement, {} other)",
        packets - packets_movement
    );

    Ok(())
}
