import Phaser from 'phaser';

/**
 * Scene de lecture de la vidéo d'intro en mode paysage (User1 uniquement).
 */
export class IntroVideoScene extends Phaser.Scene {
    private video?: Phaser.GameObjects.Video;
    private playButton?: Phaser.GameObjects.Container;
    private hasFinished: boolean = false;

    constructor() {
        super({ key: 'IntroVideoScene' });
    }

    create(): void {
        this.cameras.main.setBackgroundColor('#000000');
        this.showPlayButton();
    }

    private showPlayButton(): void {
        const { width, height } = this.cameras.main;
        this.playButton = this.add.container(width / 2, height / 2);

        const circle = this.add.circle(0, 0, 60, 0x4CAF50, 1);
        circle.setStrokeStyle(4, 0xffffff);
        const triangle = this.add.triangle(5, 0, -15, -20, -15, 20, 20, 0, 0xffffff);
        const text = this.add.text(0, 100, 'Appuyez pour demarrer la video', {
            fontSize: '20px',
            color: '#ffffff',
            align: 'center',
            fontFamily: 'Arial',
        });
        text.setOrigin(0.5);

        this.playButton.add([circle, triangle, text]);
        circle.setInteractive({ useHandCursor: true });
        circle.on('pointerdown', () => {
            this.playButton?.destroy();
            this.playButton = undefined;
            this.playIntroVideo();
        });
    }

    private playIntroVideo(): void {
        const { width, height } = this.cameras.main;

        // Déterminer quelle vidéo jouer selon le joueur sélectionné
        const selectedPlayer = this.registry.get('selectedPlayer') as string | undefined;
        const videoKey = selectedPlayer === 'user2' ? 'intro_user2' : 'intro_user1';

        console.log('[IntroVideoScene] Lecture de la vidéo:', videoKey);
        console.log('[IntroVideoScene] Vidéo dans cache?', this.cache.video.exists(videoKey));

        if (!this.cache.video.exists(videoKey)) {
            console.warn(`[IntroVideoScene] Vidéo ${videoKey} non trouvée, passage au menu`);
            this.gotoMenu();
            return;
        }

        console.log('[IntroVideoScene] Création de l\'objet vidéo');
        this.video = this.add.video(width / 2, height / 2, videoKey);
        this.video.setOrigin(0.5);
        this.video.setDepth(1000);

        // Attendre que les métadonnées soient chargées
        this.video.on('metadata', () => {
            if (!this.video) return;

            const videoWidth = this.video.video?.videoWidth || 1280;
            const videoHeight = this.video.video?.videoHeight || 720;

            console.log('[IntroVideoScene] Métadonnées vidéo chargées:', videoWidth, 'x', videoHeight);

            this.video.setSize(videoWidth, videoHeight);
            this.updateVideoSize();
        });

        // Activer l'audio
        this.video.setMute(false);
        this.video.setLoop(false);

        console.log('[IntroVideoScene] Démarrage de la lecture');
        // IMPORTANT: Utiliser play(true) pour l'autoplay après interaction utilisateur (requis pour iOS)
        const started = this.video.play(true);
        console.log('[IntroVideoScene] Lecture démarrée?', started);

        if (!started) {
            console.warn('[IntroVideoScene] Lecture vidéo bloquée → passage au menu');
            this.gotoMenu();
            return;
        }

        // Événement de fin de vidéo
        this.video.once('complete', () => {
            console.log('[IntroVideoScene] Vidéo terminée (événement complete) → passage au menu');
            this.gotoMenu();
        });

        // Événement alternatif 'stop' au cas où 'complete' ne se déclenche pas
        this.video.once('stop', () => {
            console.log('[IntroVideoScene] Vidéo arrêtée (événement stop) → passage au menu');
            this.gotoMenu();
        });

        this.video.once('error', (err: any) => {
            console.error('[IntroVideoScene] Erreur lecture vidéo:', err);
            this.gotoMenu();
        });

        // Timer de sécurité basé sur la durée de la vidéo
        // IMPORTANT pour iOS où 'complete' ne se déclenche pas toujours
        this.video.on('metadata', () => {
            if (!this.video || !this.video.video) return;
            const duration = this.video.getDuration();
            console.log('[IntroVideoScene] Durée de la vidéo:', duration, 'secondes');

            // Timer de sécurité : durée vidéo + 0.5 seconde
            this.time.delayedCall((duration + 0.5) * 1000, () => {
                if (!this.hasFinished) {
                    console.warn('[IntroVideoScene] Timer de sécurité (metadata) déclenché → passage au menu');
                    this.gotoMenu();
                }
            });
        });

        // Timer de sécurité fixe au cas où les métadonnées ne se chargent pas
        // Vidéo d'intro = 8 secondes + 1 seconde de marge
        this.time.delayedCall(9000, () => {
            if (!this.hasFinished) {
                console.warn('[IntroVideoScene] Timer de sécurité fixe (9s) déclenché → passage au menu');
                this.gotoMenu();
            }
        });

        // Ajuster si resize
        this.scale.on('resize', (gameSize: Phaser.Structs.Size) => {
            if (this.video && this.video.isPlaying()) {
                this.updateVideoSize(gameSize.width, gameSize.height);
            }
        });
    }

    private updateVideoSize(targetW?: number, targetH?: number): void {
        if (!this.video) return;
        const w = targetW ?? this.cameras.main.width;
        const h = targetH ?? this.cameras.main.height;

        const nativeW = this.video.video?.videoWidth || 1280;
        const nativeH = this.video.video?.videoHeight || 720;
        const videoRatio = nativeW / nativeH;
        const screenRatio = w / h;

        let scale: number;
        if (screenRatio > videoRatio) {
            scale = h / nativeH;
        } else {
            scale = w / nativeW;
        }

        this.video.setScale(scale);
        this.video.setPosition(w / 2, h / 2);
    }

    private gotoMenu(): void {
        if (this.hasFinished) return;
        this.hasFinished = true;
        this.video?.stop();
        this.video?.destroy();
        this.scene.start('MenuScene');
    }
}
