export class Player {
    constructor(scene) {
        this.scene = scene;
        this.sprite = null;
        this.cursors = null;
        this.thruster = null;
        this.trailParticles = [];
        this.trailCounter = 0;
    }

    create() {
        // Create player ship
        this.sprite = this.scene.physics.add.sprite(300, 700, 'player-sprite', 0);
        this.sprite.setCollideWorldBounds(true);
        
        // Setup controls
        this.cursors = this.scene.input.keyboard.createCursorKeys();
        
        // Replace cursor keys with A/D/W/S keys for movement
        const aKey = this.scene.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.A);
        const dKey = this.scene.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.D);
        const wKey = this.scene.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.W);
        const sKey = this.scene.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.S);
        
        // Create thruster effect
        this.createThruster();
        
        return { aKey, dKey, wKey, sKey };
    }

    createThruster() {
        // Create a simple thruster graphic using canvas
        const canvas = document.createElement('canvas');
        canvas.width = 32;
        canvas.height = 32;
        
        const ctx = canvas.getContext('2d');
        
        // Draw thruster flame effect (yellow/orange gradient)
        const gradient = ctx.createRadialGradient(16, 16, 0, 16, 16, 16);
        gradient.addColorStop(0, '#ffff00');
        gradient.addColorStop(0.5, '#ff9900');
        gradient.addColorStop(1, '#ff3300');
        
        ctx.beginPath();
        ctx.arc(16, 16, 12, 0, Math.PI * 2);
        ctx.fillStyle = gradient;
        ctx.fill();
        
        // Add some flickering effect with a second inner circle
        ctx.beginPath();
        ctx.arc(16, 16, 8, 0, Math.PI * 2);
        ctx.fillStyle = '#ffffff';
        ctx.fill();
        
        this.scene.textures.addCanvas('thruster', canvas);
        
        // Create thruster sprite (initially hidden)
        this.thruster = this.scene.add.sprite(0, 0, 'thruster');
        this.thruster.setOrigin(0.5);
        this.thruster.setVisible(false);
    }

    update(aKey, dKey, wKey, sKey) {
        // Player movement with A/D keys for horizontal
        if (aKey.isDown) {
            this.sprite.setVelocityX(-200);
            this.sprite.setFrame(1);
        } else if (dKey.isDown) {
            this.sprite.setVelocityX(200);
            this.sprite.setFrame(2);
        } else {
            this.sprite.setVelocityX(0);
            this.sprite.setFrame(0);
        }
        
        // Player movement with W/S keys for vertical
        if (wKey.isDown) {
            // Limit upward movement to 200px from bottom of screen (500px y position)
            if (this.sprite.y > 500) {
                this.sprite.setVelocityY(-200);
            } else {
                this.sprite.setVelocityY(0);
            }
        } else if (sKey.isDown) {
            // Limit downward movement to 700px from top of screen
            if (this.sprite.y < 700) {
                this.sprite.setVelocityY(200);
            } else {
                this.sprite.setVelocityY(0);
            }
        } else {
            this.sprite.setVelocityY(0);
        }
        
        // Handle thruster effect when player is accelerating upward
        if (wKey.isDown) {
            // Show and position the thruster
            if (!this.thruster.visible) {
                this.thruster.setVisible(true);
                // Play sound and store the instance
                this.thrusterSoundInstance = this.scene.sound.add('thruster');
                this.thrusterSoundInstance.play();
            }
            
            // Position the thruster behind the player (below the ship)
            this.thruster.x = this.sprite.x;
            this.thruster.y = this.sprite.y + 25; // Position below player
            
            // Add some flickering animation effect
            const scale = 0.8 + Math.sin(this.scene.time.now * 0.01) * 0.2;
            this.thruster.setScale(scale);
            
            // Create trail particles when moving upward
            if (this.sprite.y > 500) {
                this.createTrail();
            }
        } else {
            // Hide the thruster when W key is not pressed
            if (this.thruster.visible) {
                this.thruster.setVisible(false);
                // Stop the thruster sound when thrusting stops
                if (this.thrusterSoundInstance) {
                    this.thrusterSoundInstance.stop();
                    this.thrusterSoundInstance = null;
                }
            }
        }
        
        // Update trail particles
        this.updateTrails();
    }

    createTrail() {
        // Only create a new trail particle every few frames to avoid too many particles
        this.trailCounter++;
        if (this.trailCounter < 3) return;
        
        this.trailCounter = 0;
        
        // Create a trail particle at player position
        const trailParticle = this.scene.add.sprite(this.sprite.x, this.sprite.y + 30, 'thruster');
        trailParticle.setOrigin(0.5);
        
        // Make it smaller and more transparent for the trail effect
        trailParticle.setScale(0.4);
        trailParticle.setAlpha(0.7);
        
        // Store particle with its fade speed
        this.trailParticles.push({
            sprite: trailParticle,
            alphaSpeed: 0.01,
            scaleSpeed: -0.005
        });
    }

    updateTrails() {
        // Update and remove old trail particles
        for (let i = this.trailParticles.length - 1; i >= 0; i--) {
            const particle = this.trailParticles[i];
            
            // Gradually fade out the particle
            particle.sprite.setAlpha(particle.sprite.alpha - particle.alphaSpeed);
            
            // Gradually shrink the particle
            particle.sprite.setScale(particle.sprite.scale + particle.scaleSpeed);
            
            // Remove particles that are fully faded or too small
            if (particle.sprite.alpha <= 0 || particle.sprite.scale <= 0) {
                particle.sprite.destroy();
                this.trailParticles.splice(i, 1);
            }
        }
    }

    shoot() {
        // Shooting functionality will be handled in GameScene
    }
}