using System.Collections.Generic;
using Decimation.Lib.Items;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria;
using Terraria.ID;

namespace Decimation.Content.Projectiles.DuneWyrm
{
    public class Sundial : DecimationProjectile
    {
        private static readonly IDictionary<int, int> ProjectilesIndex = new Dictionary<int, int>();
        private static readonly IDictionary<int, int> ProjectilesCount = new Dictionary<int, int>();
        private static readonly int IndexResetCounterMax = 60;

        protected override int AnimationFrames => 12;
        protected override int AnimationFps => 1;
        protected override DecimationWeapon.DamageType DamageType => DecimationWeapon.DamageType.Magic;
        protected override int Damages => 15;

        private int ProjectileIndex
        {
            get
            {
                if (!ProjectilesIndex.ContainsKey(Owner)) ProjectilesIndex[Owner] = -1;
                return ProjectilesIndex[Owner];
            }
            set
            {
                int index = value;
                if (index > AnimationFrames) index = AnimationFrames;
                ProjectilesIndex[Owner] = index;
            }
        }

        private int Count
        {
            get
            {
                if (!ProjectilesCount.ContainsKey(Owner)) Count = -1;
                return ProjectilesCount[Owner];
            }
            set => ProjectilesCount[Owner] = value;
        }

        private int Index
        {
            get => (int) projectile.localAI[0];
            set => projectile.localAI[0] = value;
        }

        private int Owner
        {
            get => (int) projectile.localAI[1];
            set => projectile.localAI[1] = value;
        }

        private bool EndOfLife => projectile.timeLeft < IndexResetCounterMax || projectile.penetrate <= 1;

        protected override void Init()
        {
            projectile.width = 20;
            projectile.height = 22;
            projectile.timeLeft = 180 + IndexResetCounterMax;
            projectile.aiStyle = -1;
            projectile.tileCollide = false;
            projectile.knockBack = 7;

            Owner = projectile.owner;
            if (Count++ == 0) ProjectileIndex = 0;
            Index = ++ProjectileIndex;

            projectile.penetrate = Index + 1;
        }

        public override bool PreKill(int timeLeft)
        {
            Count -= 1;

            return true;
        }

        public override bool PreAI()
        {
            projectile.frame = Index - 1;
            if (projectile.frame >= AnimationFrames) projectile.frame = AnimationFrames - 1;

            return true;
        }


        public override void AI()
        {
            if (EndOfLife)
            {
                projectile.velocity = Vector2.Zero;
                projectile.penetrate = -1;
                projectile.damage = 0;
                projectile.alpha = 0;
            }
            else
            {
                Lighting.AddLight(projectile.Center, 0, 0.8f, 1);
                projectile.velocity.Normalize();
                projectile.velocity *= Index;

                if (Index >= 6) projectile.damage = 25;
                if (Index >= 12) projectile.damage = 35;
            }
        }

        public override void OnHitNPC(NPC target, int damage, float knockback, bool crit)
        {
            if (Index == 1) target.AddBuff(BuffID.Slow, 300);
        }

        public override void OnHitPvp(Player target, int damage, bool crit)
        {
            if (Index == 1) target.AddBuff(BuffID.Slow, 300);
        }

        public override bool PreDraw(SpriteBatch spriteBatch, Color lightColor)
        {
            return !EndOfLife; //    projectile.alpha = 0 does not always work?
        }
    }
}