//Author - Devin Reimer - http://blog.almostlogical.com
using UnityEngine;
using System.Collections;

public class DartGun : MonoBehaviour {

    public GameObject dartPrefab;
    public Camera playerCamera;
    public float rateOfFire = .15f;
    public GameObject gunEnd;
    private float nextFireTime = 0;
    public float rotationSpeed;

    public GameObject powerBar;
    public float dischargeTime = .25f;
    private int lastPowerBarFrame = -1;

    public LineRenderer laser;
    public GameObject laserBall;

    public GameObject laserHolePrefab;

	// Use this for initialization
	void Start ()
    {
     
	}
	
	// Update is called once per frame
	void Update () 
    {
        bool isGunFired = false;
        if (Input.GetMouseButtonDown(0) && Time.time>nextFireTime)
        {
            isGunFired = true;
            //SpawnDart();
            //this.GetComponent<AudioSource>().Play();

            nextFireTime = Time.time + rateOfFire;
        }

        Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
        Debug.DrawRay(ray.origin, ray.direction, Color.yellow);
        float distance = 10;
        RaycastHit hit;

        if (isGunFired)
        {
            audio.Play();
        }

        int powerBarFrame = 0;

        if (Time.time<=nextFireTime)
        {
            float elapsedTime = Time.time - (nextFireTime - rateOfFire);
            float percent;
            if (elapsedTime < dischargeTime)
            {
                percent = elapsedTime / dischargeTime;
                powerBarFrame = (int)(percent * 6);

             
                //powerBarFrame = (int)((rateOfFire - (nextFireTime - Time.time))/rateOfFire)*6;
                //Debug.Log("Power Bar Frames:" + powerBarFrame);
            }
            else
            {
                percent = 1-((elapsedTime - dischargeTime) / (rateOfFire - dischargeTime));
                powerBarFrame = (int)(percent * 6);


                //powerBarFrame = (int)((((nextFireTime - Time.time) - dischargeTime) / (rateOfFire) * 6);
            }
        }

        if (powerBarFrame != lastPowerBarFrame)
        {
            float yOffset = 0.0f;
            
            if (powerBarFrame == 1) { yOffset = -0.159f; }
            else if (powerBarFrame == 2) { yOffset = -0.315f; }
            else if (powerBarFrame == 3) { yOffset = -0.47f; }
            else if (powerBarFrame == 4) { yOffset = -0.625f; }
            else if (powerBarFrame == 5) { yOffset = -0.782f; }
        

            yOffset = -0.159f * powerBarFrame;
            //powerBar.renderer.material.mainTextureOffset = new Vector2(0,(float)tempF);
            Vector2 offset = new Vector2(0.0f, yOffset);
            powerBar.renderer.material.mainTextureOffset = offset;
            powerBar.renderer.material.SetTextureOffset("_Illum", offset);
            lastPowerBarFrame = powerBarFrame;
            //Debug.Log(powerBar.renderer.material.mainTextureOffset);
        }

        if (laser.gameObject.active)
        {
            if (Time.time - (nextFireTime - rateOfFire) > .1)
            {
               laser.gameObject.SetActiveRecursively(false);
                laserBall.gameObject.SetActiveRecursively(false);
            }

            
        }
       


        if (Physics.Raycast(ray, out hit, 10))
        {
           
            distance = hit.distance;

            if (isGunFired)
            {
                Debug.Log("GUN FIRED");
               // laser.enabled = true;
               // laserBall.transform.parent.GetComponent<MeshRenderer>().enabled = true;
                laser.gameObject.SetActiveRecursively(true);
                laserBall.gameObject.SetActiveRecursively(true);
                //laser.SetPosition(1, new Vector3(0, 0, distance));

                laser.SetPosition(1, laser.transform.InverseTransformPoint(hit.point));

                //powerBar.renderer.material.SetTextureOffset("_MainTex",);

                if (hit.transform.tag == "Enemy")
                {
                    Debug.Log("Enemy Found");
                    Transform mainEnemyContainer = hit.transform;
                    Enemy enemy = mainEnemyContainer.GetComponent<Enemy>();
                    if (enemy == null)
                    {
                        if (mainEnemyContainer.parent != null)
                        {
                            enemy = mainEnemyContainer.parent.GetComponent<Enemy>();
                        }
                    }

                    if (enemy)
                    {
                        enemy.HitTarget();
                    }


                }
                else
                {
                    Instantiate(laserHolePrefab, hit.point, Quaternion.Euler(hit.normal + new Vector3(0, 180, 0)));
                    //hit.point
                }
            }
        }
        else if (isGunFired)
        {
            Debug.Log("MISSED EVERYTHING");
            laser.SetPosition(1, laser.transform.InverseTransformPoint(ray.GetPoint(10)));
            laser.gameObject.SetActiveRecursively(true);
            laserBall.gameObject.SetActiveRecursively(true);
        }

      
        Vector3 distancePoint = ray.GetPoint(distance);
       // Quaternion prev = transform.rotation;
        //transform.LookAt(distancePoint);

        Vector3 difference = distancePoint - transform.position;
        Quaternion finalRot = Quaternion.LookRotation(difference, Vector3.up);
        //transform.rotation = Quaternion.RotateTowards(transform.rotation, finalRot, 5);
        transform.rotation = Quaternion.Slerp(transform.rotation, finalRot, Time.deltaTime * rotationSpeed);
        //transform.rotation = rotation;

       
	}

    private void FireGun()
    {

    }

    private void SpawnDart()
    {
        Instantiate(dartPrefab,gunEnd.transform.position,gunEnd.transform.rotation);

        /*
        Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition + Vector3.up*15);
        GameObject newDart = (GameObject)Instantiate(dartPrefab,transform.position,Quaternion.FromToRotation(Vector3.forward, ray.direction*8));
         * */

        //create a ray towards the mouse position
        //var mray = camera.ScreenPointToRay(Input.mousePosition);
        /*
        Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
        float distance = 10;
        RaycastHit hit;

        if (Physics.Raycast(ray,out hit,10))
        {
            distance = hit.distance;
        }
        Vector3 distancePoint = ray.GetPoint(distance);
        //Vector3 rDir = ray.direction * 100;

        transform.LookAt(distancePoint);
         * */
        //transform.LookAt(distancePoint);
        //GameObject newDart = (GameObject)Instantiate(dartPrefab, transform.position, transform.rotation);
      
        //newDart.transform.LookAt(distancePoint);
        //grab a distant point to use to calcuate where to aim the projectile
        //distantPoint = mray.GetPoint(10);

        //the direction of the ray
       // var rDirection = mray.direction * 100;


        //var myMissile = Instantiate (missle, transform.position, transform.rotation);
//rotate the missle to look at the distant point
//myMissile.transform.LookAt(distantPoint);


        //draw a line in the editor
        //Debug.DrawRay(mray.origin, mray.direction * 10, Color.yellow);

    
    }
}
