using System;
using Cirno.Scripts.Controllers;
using Cirno.Scripts.Weapons;
using Godot;
using Godot.Collections;

namespace Cirno.Scripts.Components;

public partial class BulletSpawner : Node2D
{
    [Export] public PackedScene BulletScene;
    private GameManager _gameManager;

    public override void _Ready()
    {
        _gameManager = this.GetGameManager();
    }

    public void SpawnBullet(BulletInfo bulletInfo)
    {
        var bulletScene = bulletInfo.BulletScene ?? BulletScene;
        Bullet bullet;

        for (int i = 0; i < bulletInfo.BulletCount; i++)
        {
            // bullet = this.CreateChildOf<Bullet>(_gameManager.BulletsContainer, bulletScene, bulletInfo.Position);
            bullet = PoolingManager.Instance.SpawnBullet(bulletInfo.OriginalBulletResource);
            bullet.GlobalPosition = bulletInfo.Position;

            // var bullet = this.CreateChildOf<Bullet>(_gameManager.BulletsContainer, bulletInfo.BulletScene ?? BulletScene, bulletInfo.Position);

            if (bulletInfo.Modifier is not null)
            {
                bulletInfo = bulletInfo.Modifier.ModifyBullet(bulletInfo, i, bulletInfo.BulletCount);
            }
            
            bullet.Initialize(bulletInfo, _gameManager);

            // float modifiedSpeed = bulletInfo.Modifier?.ModifySpeed(bulletInfo.Speed, i, bulletInfo.BulletCount) ?? bulletInfo.Speed;
            // bullet.Speed = modifiedSpeed;

            Vector2 baseDirection = bulletInfo.Direction == Vector2.Zero ? Vector2.Right : bulletInfo.Direction.Normalized();
            float baseAngle = Mathf.Atan2(baseDirection.Y, baseDirection.X);

            float offsetRadians = Mathf.DegToRad(bulletInfo.RotationOffset);
            float spreadStep = Mathf.DegToRad(bulletInfo.Spread) / Mathf.Max(1, bulletInfo.BulletCount - 1); // Ensure proper spread spacing, also add 1 if 0
            float angle = baseAngle + offsetRadians + (spreadStep * i);
            // float angle = baseAngle + Mathf.DegToRad(bulletInfo.RotationOffset + (bulletInfo.Spread / bulletInfo.BulletCount) * i);

            Vector2 bulletDirection = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));

            bullet.SetDirection(bulletDirection);
        }
    }

    // public void SpawnBullet(Vector2 position, Vector2 direction, float speed, BulletOwner owner, int count = 1, float angleOffset = 0, float spread = 0, PackedScene bulletScene = null, IBulletModifier modifier = null)
    // {
    //     for (int i = 0; i < count; i++)
    //     {
    //         var bullet = this.CreateChildOf<Bullet>(_gameManager.BulletsContainer, bulletScene ?? BulletScene, position);
    //
    //         //var bullet = BulletScene.Instantiate<Bullet>();
    //         bullet.Position = position;
    //         //bullet.Speed = speed;
    //
    //         if (modifier is not null)
    //         {
    //             bullet.BulletInfo = modifier.ModifyBullet(bullet.BulletInfo, i, count);
    //         }
    //         
    //         //float modifiedSpeed = modifier?.ModifySpeed(speed, i, count) ?? speed;
    //         //bullet.Speed = modifiedSpeed;
    //
    //         Vector2 baseDirection = direction == Vector2.Zero ? Vector2.Right : direction.Normalized();
    //         float baseAngle = Mathf.Atan2(baseDirection.Y, baseDirection.X);
    //         //float angle = angleOffset + (360 / count) * i;
    //         float angle = baseAngle + Mathf.DegToRad(angleOffset + (spread / count) * i);
    //         Vector2 bulletDirection = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
    //         //Vector2 bulletDirection = new Vector2(Mathf.Cos(Mathf.DegToRad(angle)), Mathf.Sin(Mathf.DegToRad(angle)));
    //
    //         bullet.SetDirection(bulletDirection);
    //         //GetParent().AddChild(bullet);
    //     }
    // }

    // public void SpawnTargetedBullet(Vector2 position, Vector2 target, float speed, BulletOwner owner, PackedScene bulletScene = null, int burstCount = 1, float spread = 0, IBulletModifier modifier = null)
    // {
    //     Vector2 direction = (target - position).Normalized();
    //     SpawnBullet(position, direction, speed, owner, burstCount, spread: spread, bulletScene: bulletScene, modifier: modifier);
    // }
}