import Phaser from 'phaser';

/**
 * Coffre au trésor final
 * S'ouvre seulement si le joueur a collecté assez de cadeaux
 * Contient un mega bonus
 */
export class TreasureChest extends Phaser.Physics.Arcade.Sprite {
    private isOpen: boolean = false;
    private requiredGifts: number;

    constructor(scene: Phaser.Scene, x: number, y: number, requiredGifts: number = 15) {
        super(scene, x, y, 'chest');

        this.requiredGifts = requiredGifts;

        scene.add.existing(this);
        scene.physics.add.existing(this, true); // Static body

        // Créer texture si elle n'existe pas
        if (!scene.textures.exists('chest')) {
            this.createChestTextures(scene);
        }

        this.setTexture('chest-closed');
        this.setScale(2); // Plus grand que les autres objets

        // Effet de brillance pour attirer l'attention
        this.createGlowEffect(scene);

        // Texte indicateur au-dessus
        this.createRequirementText(scene, x, y);
    }

    /**
     * Crée les textures du coffre (fermé et ouvert)
     */
    private createChestTextures(scene: Phaser.Scene): void {
        // Coffre FERMÉ
        const closedGraphics = scene.add.graphics();

        // Corps du coffre (marron)
        closedGraphics.fillStyle(0x8B4513, 1);
        closedGraphics.fillRoundedRect(5, 20, 50, 35, 5);

        // Couvercle
        closedGraphics.fillStyle(0xA0522D, 1);
        closedGraphics.fillRoundedRect(0, 15, 60, 20, 8);

        // Serrure dorée
        closedGraphics.fillStyle(0xFFD700, 1);
        closedGraphics.fillCircle(30, 25, 6);
        closedGraphics.fillRect(28, 25, 4, 8);

        // Contour
        closedGraphics.lineStyle(2, 0x654321, 1);
        closedGraphics.strokeRoundedRect(0, 15, 60, 40, 8);

        closedGraphics.generateTexture('chest-closed', 60, 60);
        closedGraphics.destroy();

        // Coffre OUVERT
        const openGraphics = scene.add.graphics();

        // Corps du coffre
        openGraphics.fillStyle(0x8B4513, 1);
        openGraphics.fillRoundedRect(5, 30, 50, 25, 5);

        // Couvercle ouvert (simplifié - juste décalé vers le haut)
        openGraphics.fillStyle(0xA0522D, 1);
        openGraphics.fillRoundedRect(0, 5, 60, 18, 8);

        // Trésor qui brille à l'intérieur
        openGraphics.fillStyle(0xFFD700, 1);
        openGraphics.fillCircle(20, 38, 8);
        openGraphics.fillCircle(30, 35, 10);
        openGraphics.fillCircle(40, 38, 8);

        // Éclat blanc
        openGraphics.fillStyle(0xFFFFFF, 0.8);
        openGraphics.fillCircle(30, 35, 4);

        // Contour
        openGraphics.lineStyle(2, 0x654321, 1);
        openGraphics.strokeRoundedRect(5, 30, 50, 25, 5);

        openGraphics.generateTexture('chest-open', 60, 60);
        openGraphics.destroy();
    }

    /**
     * Crée un effet de brillance autour du coffre
     */
    private createGlowEffect(scene: Phaser.Scene): void {
        const glow = scene.add.circle(this.x, this.y, 50, 0xFFD700, 0.2);
        glow.setDepth(this.depth - 1);

        scene.tweens.add({
            targets: glow,
            scaleX: 1.3,
            scaleY: 1.3,
            alpha: 0.4,
            duration: 1500,
            yoyo: true,
            repeat: -1,
            ease: 'Sine.easeInOut',
        });
    }

    /**
     * Crée le texte qui indique le nombre de cadeaux requis
     */
    private createRequirementText(scene: Phaser.Scene, x: number, y: number): void {
        const text = scene.add.text(
            x,
            y - 80,
            `🎁 ${this.requiredGifts} cadeaux requis`,
            {
                fontSize: '20px',
                color: '#FFD700',
                stroke: '#000000',
                strokeThickness: 4,
                fontStyle: 'bold',
            }
        );
        text.setOrigin(0.5);
        text.setDepth(this.depth + 1);

        // Animation pulse
        scene.tweens.add({
            targets: text,
            scaleX: 1.1,
            scaleY: 1.1,
            duration: 800,
            yoyo: true,
            repeat: -1,
        });
    }

    /**
     * Vérifie si le joueur peut ouvrir le coffre
     */
    public canOpen(giftsCollected: number): boolean {
        return !this.isOpen && giftsCollected >= this.requiredGifts;
    }

    /**
     * Ouvre le coffre et donne le mega bonus
     */
    public open(scene: Phaser.Scene): number {
        if (this.isOpen) return 0;

        this.isOpen = true;
        this.setTexture('chest-open');

        // Flash doré géant
        scene.cameras.main.flash(500, 255, 215, 0, true);

        // Particules dorées qui explosent
        this.createExplosionParticles(scene);

        // Message épique
        const megaBonusText = scene.add.text(
            scene.cameras.main.scrollX + scene.cameras.main.width / 2,
            scene.cameras.main.height / 2 - 100,
            '🏆 COFFRE OUVERT ! 🏆\n★★ MEGA BONUS +1000 ★★',
            {
                fontSize: '56px',
                color: '#FFD700',
                stroke: '#FF4500',
                strokeThickness: 8,
                fontStyle: 'bold',
                align: 'center',
            }
        );
        megaBonusText.setOrigin(0.5);
        megaBonusText.setScrollFactor(0);
        megaBonusText.setDepth(2000);

        // Animation du texte
        scene.tweens.add({
            targets: megaBonusText,
            scaleX: 1.3,
            scaleY: 1.3,
            alpha: 0,
            duration: 3000,
            ease: 'Power2',
            onComplete: () => {
                megaBonusText.destroy();
            },
        });

        console.log('🏆 COFFRE AU TRÉSOR OUVERT ! MEGA BONUS +1000 !');

        return 1000; // Mega bonus de points
    }

    /**
     * Crée une explosion de particules dorées
     */
    private createExplosionParticles(scene: Phaser.Scene): void {
        // Créer des cercles dorés qui explosent
        for (let i = 0; i < 20; i++) {
            const angle = (i / 20) * Math.PI * 2;
            const particle = scene.add.circle(this.x, this.y, 5, 0xFFD700);
            particle.setDepth(this.depth + 10);

            scene.tweens.add({
                targets: particle,
                x: this.x + Math.cos(angle) * 100,
                y: this.y + Math.sin(angle) * 100 - 50,
                alpha: 0,
                duration: 1000,
                ease: 'Power2',
                onComplete: () => {
                    particle.destroy();
                },
            });
        }
    }

    /**
     * Vérifie si le coffre est ouvert
     */
    public getIsOpen(): boolean {
        return this.isOpen;
    }

    /**
     * Retourne le nombre de cadeaux requis
     */
    public getRequiredGifts(): number {
        return this.requiredGifts;
    }
}
