import Phaser from 'phaser';
import { Dog } from './Dog';

/**
 * Cage contenant le chien
 * Peut être ouverte avec une clé
 */
export class Cage extends Phaser.GameObjects.Container {
    public scene: Phaser.Scene;
    private dog: Dog;
    private door?: Phaser.GameObjects.Rectangle;
    private bars: Phaser.GameObjects.Rectangle[] = [];
    private isOpen: boolean = false;
    private lockIcon?: Phaser.GameObjects.Text;

    constructor(scene: Phaser.Scene, x: number, y: number) {
        super(scene, x, y);
        this.scene = scene;

        scene.add.existing(this);
        this.setDepth(49);

        // Créer la cage visuellement
        this.createCage();

        // Créer le chien à l'intérieur
        this.dog = new Dog(scene, x, y - 10, 150);
    }

    /**
     * Crée la cage (barreaux, sol, porte)
     */
    private createCage(): void {
        const cageWidth = 180;
        const cageHeight = 150;

        // Sol de la cage
        const floor = this.scene.add.rectangle(0, 10, cageWidth, 10, 0x8B4513);
        this.add(floor);

        // Toit
        const roof = this.scene.add.rectangle(0, -cageHeight + 10, cageWidth, 8, 0x654321);
        this.add(roof);

        // Barreaux verticaux (fond)
        const barCount = 8;
        const barSpacing = cageWidth / barCount;
        for (let i = 0; i < barCount; i++) {
            const barX = -cageWidth / 2 + i * barSpacing + barSpacing / 2;
            const bar = this.scene.add.rectangle(
                barX,
                -cageHeight / 2 + 10,
                6,
                cageHeight - 10,
                0x555555
            );
            this.add(bar);
            this.bars.push(bar);
        }

        // Porte (côté droit de la cage)
        this.door = this.scene.add.rectangle(
            cageWidth / 2 - 3,
            -cageHeight / 2 + 10,
            8,
            cageHeight - 10,
            0x333333
        );
        this.add(this.door);

        // Icône de cadenas
        this.lockIcon = this.scene.add.text(cageWidth / 2 - 20, -cageHeight / 2, '🔒', {
            fontSize: '32px',
        });
        this.add(this.lockIcon);
    }

    /**
     * Ouvre la cage
     */
    public open(): void {
        if (this.isOpen) return;
        this.isOpen = true;

        // Retirer le cadenas
        this.lockIcon?.destroy();

        // Animation d'ouverture de la porte
        this.scene.tweens.add({
            targets: this.door,
            x: this.door!.x + 80,
            angle: -90,
            duration: 1000,
            ease: 'Back.easeOut',
            onComplete: () => {
                // Libérer le chien
                this.dog.free();
            }
        });

        // Son d'ouverture (optionnel)
        // this.scene.sound.play('cage-open');
    }

    /**
     * Vérifie si la cage est ouverte
     */
    public isOpened(): boolean {
        return this.isOpen;
    }

    /**
     * Retourne le chien
     */
    public getDog(): Dog {
        return this.dog;
    }

    /**
     * Update pour le chien
     */
    public update(): void {
        this.dog.update();
    }
}
