// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use core::f64::consts::PI;
use fidl_fuchsia_game_tennis as fidl_tennis;
use fidl_fuchsia_game_tennis::{GameState, PaddleProxy};
use fuchsia_syslog::fx_log_info;
use parking_lot::Mutex;
use std::f64;
use std::sync::Arc;

const TIME_SCALE_FACTOR: f64 = 0.02; // Time scale factor: scales all movements/speeds by this amount.
const BOARD_HEIGHT: f64 = 10.0;
const BOARD_WIDTH: f64 = 20.0;
const PADDLE_SPEED: f64 = 0.4 * TIME_SCALE_FACTOR; // distance paddle travels per step
const PADDLE_SIZE: f64 = 1.0; // vertical height of paddle
const PADDLE_MAX_ANGLE: f64 = std::f64::consts::PI / 4.0; // Maximum paddle angle
const BALL_SPEEDUP_MULTIPLIER: f64 = 1.05; // speed multiplier applied on every paddle bounce
#[allow(unused)]
const MAX_BOUNCE_ANGLE: f64 = 1.3; // in radians, bounce angle when hitting very top edge of paddle

pub struct Game {
    state: GameState,
    player_1: Option<Player>,
    player_2: Option<Player>,
    ball_dx: f64,
    ball_dy: f64,
}

#[derive(Clone)]
struct Player {
    pub name: String,
    pub state: Arc<Mutex<PlayerState>>,
    pub proxy: PaddleProxy,
}

#[derive(Clone)]
pub enum PlayerState {
    Up,
    Down,
    Stop,
    Disconnected,
}

fn calc_paddle_movement(pos: &mut f64, state: &PlayerState) -> bool {
    let player_delta = match state {
        PlayerState::Up => PADDLE_SPEED * -1.0,
        PlayerState::Down => PADDLE_SPEED,
        PlayerState::Stop => 0.0,
        PlayerState::Disconnected => return false,
    };
    let mut new_paddle_location = *pos + player_delta;
    new_paddle_location = new_paddle_location.max(PADDLE_SIZE / 2.0);
    new_paddle_location = new_paddle_location.min(BOARD_HEIGHT - PADDLE_SIZE / 2.0);
    *pos = new_paddle_location;
    true
}

fn calc_paddle_bounce(dx: &mut f64, dy: &mut f64, ball_y: f64, paddle_y: f64) {
    let speed = ((*dx) * (*dx) + (*dy) * (*dy)).sqrt() * BALL_SPEEDUP_MULTIPLIER;
    let paddle_angle = PADDLE_MAX_ANGLE * (ball_y - paddle_y) / (PADDLE_SIZE / 2.0);

    let new_ball_dx = -dx.signum() * speed * paddle_angle.cos();
    let new_ball_dy = speed * paddle_angle.sin();
    if (*dx) * new_ball_dx >= 0.0 {
        panic!("Ball bouncing in the same direction!");
    }
    *dx = new_ball_dx;
    *dy = new_ball_dy;
}

impl Game {
    /// return clone of internal state
    pub fn state(&self) -> GameState {
        fidl_tennis::GameState {
            ball_x: self.state.ball_x,
            ball_y: self.state.ball_y,
            player_1_y: self.state.player_1_y,
            player_2_y: self.state.player_2_y,
            player_1_score: self.state.player_1_score,
            player_2_score: self.state.player_2_score,
            player_1_name: self.state.player_1_name.clone(),
            player_2_name: self.state.player_2_name.clone(),
            time: self.state.time,
            game_num: self.state.game_num,
        }
    }
    pub fn new() -> Game {
        Game {
            player_1: None,
            player_2: None,
            ball_dx: 0.0,
            ball_dy: 0.0,
            state: GameState {
                ball_x: 0.0,
                ball_y: 0.0,
                game_num: 0,
                player_1_y: 0.0,
                player_2_y: 0.0,
                player_1_score: 0,
                player_2_score: 0,
                player_1_name: "".to_string(),
                player_2_name: "".to_string(),
                time: 0,
            },
        }
    }

    pub fn time_scale_factor(&self) -> f64 {
        TIME_SCALE_FACTOR
    }

    pub fn players_ready(&self) -> bool {
        return self.player_1.is_some() && self.player_2.is_some();
    }

    pub fn register_new_paddle(
        &mut self, player_name: String, paddle_proxy: PaddleProxy,
    ) -> Arc<Mutex<PlayerState>> {
        let paddle = Player {
            name: player_name.clone(),
            state: Arc::new(Mutex::new(PlayerState::Stop)),
            proxy: paddle_proxy,
        };
        let res = paddle.state.clone();
        if self.player_1.is_none() {
            self.player_1 = Some(paddle);
            self.state.player_1_name = player_name;
        } else if self.player_2.is_none() {
            self.player_2 = Some(paddle);
            self.state.player_2_name = player_name;
        } else {
            panic!("too many clients connected");
        }
        return res;
    }

    pub fn step(&mut self) {
        if self.players_ready() && self.state.game_num == 0 {
            self.new_game();
        } else if !self.players_ready() {
            // game has not started yet
            return;
        }

        self.state.time += 1;

        if !calc_paddle_movement(
            &mut self.state.player_1_y,
            &self.player_1.as_mut().unwrap().state.lock(),
        ) {
            self.player_1 = None;
            self.new_game();
            self.state.game_num = 0;
            self.state.player_1_score = 0;
            self.state.player_2_score = 0;
            return;
        }
        if !calc_paddle_movement(
            &mut self.state.player_2_y,
            &self.player_2.as_mut().unwrap().state.lock(),
        ) {
            self.player_2 = None;
            self.new_game();
            self.state.game_num = 0;
            self.state.player_1_score = 0;
            self.state.player_2_score = 0;
            return;
        }

        let mut new_ball_x = self.state.ball_x + self.ball_dx;
        let mut new_ball_y = self.state.ball_y + self.ball_dy;

        // reflect off the top/bottom of the board
        if new_ball_y <= 0.0 || new_ball_y > BOARD_HEIGHT {
            self.ball_dy = -self.ball_dy;
            if new_ball_y <= 0.0 {
                new_ball_y = new_ball_y.abs()
            } else {
                // Y = H-(y-H)
                new_ball_y = 2.0 * BOARD_HEIGHT - new_ball_y;
            }
            fx_log_info!("bounce off top or bottom");
        }

        // reflect off the left/right of the board, if a paddle is in the way
        if new_ball_x <= 0.0 {
            //
            // X+dx*t=0 => t=-X/dx
            // Y+dy*t=NY => NY=Y-X*dy/dx
            //
            new_ball_y = self.state.ball_y - self.state.ball_x * self.ball_dy / self.ball_dx;
            // we're about to go off of the left side
            if new_ball_y > self.state.player_1_y + (PADDLE_SIZE / 2.0)
                || new_ball_y < self.state.player_1_y - (PADDLE_SIZE / 2.0)
            {
                // player 1 missed, so player 2 gets a point and we reset
                fx_log_info!(
                    "ball {} {}, new y {}, paddle {}",
                    self.state.ball_x,
                    self.state.ball_y,
                    new_ball_y,
                    self.state.player_1_y
                );
                self.state.player_2_score += 1;
                self.new_game();
                return;
            } else {
                calc_paddle_bounce(
                    &mut self.ball_dx,
                    &mut self.ball_dy,
                    new_ball_y,
                    self.state.player_1_y,
                );
                new_ball_x = new_ball_x.abs();
                if self.ball_dx < 0.0 {
                    panic!("Ball going in the wrong direction");
                }
                fx_log_info!("bounce off left");
            }
        }
        if new_ball_x > BOARD_WIDTH {
            //
            // X+dx*t=BOARD_WIDTH => t=(BOARD_WIDTH-X)/dx
            // Y+dy*t=NY => NY=Y+(BOARD_WIDTH-X)*dy/dx
            //
            new_ball_y =
                self.state.ball_y + (BOARD_WIDTH - self.state.ball_x) * self.ball_dy / self.ball_dx;
            // we're about to go off of the right side
            if new_ball_y > self.state.player_2_y + (PADDLE_SIZE / 2.0)
                || new_ball_y < self.state.player_2_y - (PADDLE_SIZE / 2.0)
            {
                // player 2 missed, so player 1 gets a point and we reset
                fx_log_info!(
                    "ball {} {}, new y {}, paddle {}",
                    self.state.ball_x,
                    self.state.ball_y,
                    new_ball_y,
                    self.state.player_2_y
                );
                self.state.player_1_score += 1;
                self.new_game();
                return;
            } else {
                calc_paddle_bounce(
                    &mut self.ball_dx,
                    &mut self.ball_dy,
                    new_ball_y,
                    self.state.player_2_y,
                );
                // X = W-(x-W)
                new_ball_x = 2.0 * BOARD_WIDTH - new_ball_x;
                if self.ball_dx > 0.0 {
                    panic!("Ball going in the wrong direction");
                }
                fx_log_info!("bounce off right");
            }
        }

        self.state.ball_x = new_ball_x;
        self.state.ball_y = new_ball_y;
    }

    fn new_game(&mut self) {
        self.player_1.as_mut().map(|player| {
            *player.state.lock() = PlayerState::Stop;
            let _ = player.proxy.new_game(false);
        });
        self.player_2.as_mut().map(|player| {
            *player.state.lock() = PlayerState::Stop;
            let _ = player.proxy.new_game(true);
        });

        self.ball_dx = 0.0;
        while self.ball_dx.abs() < 0.2 {
            let angle: f64 = rand::random::<f64>() * 2.0 * PI;
            self.ball_dx = angle.sin();
            self.ball_dy = angle.cos();
        }
        self.ball_dx *= TIME_SCALE_FACTOR;
        self.ball_dy *= TIME_SCALE_FACTOR;
        self.state.ball_x = BOARD_WIDTH / 2.0;
        self.state.ball_y = BOARD_HEIGHT / 2.0;
        self.state.game_num += 1;
        self.state.player_1_y = BOARD_HEIGHT / 2.0;
        self.state.player_2_y = BOARD_HEIGHT / 2.0;
        self.state.time = 0;
    }
}
