﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MoreMountains.Tools;
using DG.Tweening;
public class PlayerController : Singleton<PlayerController>
{
    private Vector3 startPosion = new Vector3(0, 0.5f, 0);
    private int curTileId;
    private Vector2 mousePosOMD; // mouse position on mouse down
    private Vector3 playerPosOMD; //player position on mouse down
    private Vector2 mousePosOM; // mouse position on mouse 
    private Vector3 targetPosition;


    public void ResetPlayerData()
    {
        transform.position = startPosion;
        curTileId = 0;
        transform.DOKill();
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            mousePosOMD = Input.mousePosition;
            playerPosOMD = transform.position;
        }
        if (Input.GetMouseButton(0))
        {
            mousePosOM = Input.mousePosition;
        }
        if (GameController.Instance.gameStage == GameStage.Start)
        {
            float posX = playerPosOMD.x + (mousePosOM.x - mousePosOMD.x) / 100f;
            if (GameConst.AUTO_PLAY) posX = targetPosition.x;
            targetPosition = new Vector3(posX, transform.position.y, transform.position.z);
            transform.position = Vector3.Lerp(transform.position, targetPosition, 0.2f);
        }

    }

    private void Jump(TileController jumpFromTile, TileController jumpToTile)
    {
        transform.DOKill();
        float jumpDuration;

        jumpDuration = jumpToTile.noteData.timeAppear - GameController.Instance.mainAudio.time;
        if (jumpDuration <= 0)// End game
        {
            GameController.Instance.PlayerWin();
        }


        transform.DOMoveZ(jumpToTile.spawnPosition.z, jumpDuration).SetEase(Ease.Linear).OnComplete(() =>
        {
            OnGround();

        });
        float jumpHeight = jumpDuration * GameConst.JUMP_HEIGHT;
        if (jumpHeight > GameConst.MAX_JUMP_HEIGHT) jumpHeight = GameConst.MAX_JUMP_HEIGHT;
        else if (jumpHeight < GameConst.MIN_JUMP_HEIGHT) jumpHeight = GameConst.MIN_JUMP_HEIGHT;


        float jumpProcess = 0.4f;


        transform.DOMoveY(jumpHeight, jumpProcess * jumpDuration).OnComplete(() =>
        {
            transform.DOMoveY(0.5f, (1f - jumpProcess) * jumpDuration).OnComplete(() =>
            {

            }).SetEase(Ease.InSine);
        }).SetEase(Ease.OutQuad);



    }

    public void OnGround()
    {
        TileController curTile = GameController.Instance.listTilesActive[0];
        TileController nextTile = null;
        if (GameController.Instance.listTilesActive.Count > 1)
        {
            nextTile = GameController.Instance.listTilesActive[1];
        }

        if (GameConst.AUTO_PLAY)
        {
            targetPosition = new Vector3(nextTile.spawnPosition.x, targetPosition.y, targetPosition.z);
        }

        float distance = Mathf.Abs(transform.position.x - curTile.transform.position.x);
        if (distance <= 1.5f)
        {
            if (distance <= 0.5)
            {
                GameController.Instance.PlayerGetScore(5);
                curTile.PlayHitEffect(true);
            }
            else if (distance <= 1f)
            {
                GameController.Instance.PlayerGetScore(3);
                curTile.PlayHitEffect();
            }
            else
            {
                GameController.Instance.PlayerGetScore(1);
                curTile.PlayHitEffect();
            }

            Jump(curTile, nextTile);
            curTile.DoDisable();
            GameController.Instance.listTilesActive.RemoveAt(0);

        }
        else
        {
            transform.DOMoveZ(transform.position.z + 3f * GameConst.TILE_DISTANCE, 3f);
            transform.DOMoveY(-GameConst.TILE_DISTANCE * 3f, 3f).SetEase(Ease.OutQuad);
            GameController.Instance.PlayerDead();
        }
    }


}
