package com.ygames.ysoccer.match;

import com.ygames.ysoccer.events.BallKickEvent;
import com.ygames.ysoccer.framework.EMath;
import com.ygames.ysoccer.framework.EventManager;

import static com.ygames.ysoccer.match.PlayerFsm.Id.STATE_HEAD;

class PlayerStateHead extends PlayerState {

    private boolean hit;
    private boolean jumped;
    private float v;
    private static final int HEAD_FRAME_RISING = 11;
    private static final int HEAD_FRAME_FALLING = 12;

    PlayerStateHead(PlayerFsm fsm) {
        super(STATE_HEAD, fsm);
    }

    @Override
    void doActions() {
        super.doActions();

        if (!hit) {
            if (EMath.isIn(ball.z, player.z + Const.PLAYER_H - 2 * Const.BALL_R,
                player.z + Const.PLAYER_H + 2 * Const.BALL_R)) {
                if (player.ballDistance < 3 * Const.BALL_R) {

                    scene.setBallOwner(player);
                    ball.v = Math.max(170 + 7 * player.skills.heading, 1.5f * player.v);
                    ball.vz = 100 - 8 * player.skills.heading + player.vz;
                    hit = true;

                    EventManager.publish(new BallKickEvent(0.1f * (1 + 0.03f * timer)));

                    if (player.inputDevice.value) {
                        ball.a = player.inputDevice.angle;
                    } else {
                        ball.a = player.a;
                    }
                }
            }
        }

        // animation
        player.fmx = Math.round((((player.a + 360) % 360)) / 45) % 8;

        if (jumped) {
            if (player.z > 0 || player.vz > 0) {
                if (player.vz > -20) {
                    player.fmy = HEAD_FRAME_RISING;
                } else {
                    player.fmy = HEAD_FRAME_FALLING;
                }
            } else {
                player.fmy = 1;
            }
        }
    }

    @Override
    State checkConditions() {
        if (jumped && player.vz == 0) {
            return fsm.stateStandRun;
        }
        return null;
    }

    @Override
    void entryActions() {
        super.entryActions();

        hit = false;
        jumped = true;
        v = player.v;
        if (v > 0) {
            player.v = 0.5f * (player.speed) * (1 + 0.1f * player.skills.heading);
        } else {
            player.v = 0;
        }
        player.vz = 230 + 8 * player.skills.heading;

        player.fmy = HEAD_FRAME_RISING;
    }
}
