// DreamScene：每日梦境过场（睡觉后）。侵蚀越高梦境越「漏」；D3 起闪切白色病房 1 秒。

import Phaser from 'phaser';
import { director } from '../core/CorruptionDirector';
import { GAME_W, GAME_H } from '../types';

const DREAM_LINES: Record<number, string[]> = {
  0: ['……（甜甜的梦。面包，阳光，笑声。）'],
  1: ['……（甜甜的梦。面包，阳光，笑声。）'],
  2: ['……（梦里有笑声。笑声。笑声。）', '……（有什么东西，在梦的边上看着。）'],
  3: ['……（白色的光，从梦的缝隙里漏进来。）', '……（滴……滴……）'],
  4: ['……（梦很甜。甜得发苦。）', '……（白色的走廊。你在走。一直走。）'],
};

export class DreamScene extends Phaser.Scene {
  constructor() {
    super('DreamScene');
  }

  create(): void {
    this.cameras.main.setBackgroundColor('#1a1a3a');
    this.cameras.main.fadeIn(600, 0, 0, 0);

    // 星空与漂浮的糖果
    const g = this.add.graphics();
    for (let i = 0; i < 40; i++) {
      g.fillStyle(0xffffff, 0.4 + Math.random() * 0.6);
      g.fillCircle(Math.random() * GAME_W, Math.random() * GAME_H, Math.random() < 0.2 ? 1.5 : 1);
    }
    g.fillStyle(0xf7b7cb, 0.7);
    for (let i = 0; i < 5; i++) {
      g.fillCircle(30 + i * 64, 140 + Math.sin(i) * 10, 4);
    }

    void this.run();
  }

  private async run(): Promise<void> {
    const stage = director.stage;
    const lines = DREAM_LINES[stage] ?? DREAM_LINES[0];
    for (const line of lines) {
      await director.showDialogue({ lines: [line] });
      await this.wait(500);
    }

    // D3 起：闪切白色病房 1 秒（夜梦首次闪切）
    if (director.day >= 3) {
      await this.flashWard();
    }

    this.cameras.main.fadeOut(600, 0, 0, 0);
    await this.wait(650);
    director.nextDay();
    this.scene.start('HouseScene', { spawn: 'default' });
  }

  /** 白色病房闪切 1 秒 */
  private async flashWard(): Promise<void> {
    const c = this.add.container(0, 0).setDepth(50);
    const bg = this.add.rectangle(GAME_W / 2, GAME_H / 2, GAME_W, GAME_H, 0xf5f5f5);
    c.add(bg);
    // 白床（tiles16 帧 87-90）
    const bedTiles = [[87, 0, 0], [88, 16, 0], [89, 0, 16], [90, 16, 16]];
    for (const [f, dx, dy] of bedTiles) {
      c.add(this.add.image(GAME_W / 2 - 16 + dx, GAME_H / 2 - 16 + dy, 'tiles16', f).setOrigin(0));
    }
    // 白监护仪（帧 92）
    c.add(this.add.image(GAME_W / 2 + 40, GAME_H / 2 - 8, 'tiles16', 92).setOrigin(0));
    await this.wait(1000); // 1 秒
    c.destroy(true);
  }

  private wait(ms: number): Promise<void> {
    return new Promise((resolve) => this.time.delayedCall(ms, resolve));
  }
}
