import { FSM } from "./FSM";
import { BaseState } from "./BaseState";

/**
 * FSM 使用示例
 * 展示如何创建和使用状态机
 */

// ========== 示例1: 角色状态机 ==========

/**
 * 待机状态
 */
class IdleState extends BaseState {
    constructor(fsm: FSM) {
        super(fsm, "Idle");
    }
    
    onEnter(params?: any): void {
        super.onEnter(params);
        console.log("角色进入待机状态");
    }
    
    onExit(): void {
        super.onExit();
        console.log("角色离开待机状态");
    }
}

/**
 * 移动状态
 */
class MoveState extends BaseState {
    private speed: number = 1;
    
    constructor(fsm: FSM) {
        super(fsm, "Move");
    }
    
    onEnter(params?: any): void {
        super.onEnter(params);
        if (params && params.speed) {
            this.speed = params.speed;
        }
        console.log(`角色开始移动,速度: ${this.speed}`);
    }
    
    onUpdate(dt: number): void {
        console.log(`移动中... 速度: ${this.speed}`);
        // 在这里实现移动逻辑
    }
    
    onExit(): void {
        super.onExit();
        console.log("角色停止移动");
    }
}

/**
 * 攻击状态
 */
class AttackState extends BaseState {
    constructor(fsm: FSM) {
        super(fsm, "Attack");
    }
    
    onEnter(params?: any): void {
        super.onEnter(params);
        console.log("角色进入攻击状态");
        // 播放攻击动画
        // 延迟后自动返回待机状态
        setTimeout(() => {
            if (this._fsm.getCurrentStateName() === this.name) {
                this._fsm.changeState("Idle");
            }
        }, 1000);
    }
}

/**
 * 死亡状态
 */
class DeadState extends BaseState {
    constructor(fsm: FSM) {
        super(fsm, "Dead");
    }
    
    onEnter(params?: any): void {
        super.onEnter(params);
        console.log("角色死亡");
        // 播放死亡动画
    }
}

// ========== 使用示例 ==========

/**
 * 创建角色状态机
 */
export function createCharacterFSM(): FSM {
    const fsm = new FSM();
    
    // 添加所有状态
    fsm.addState(new IdleState(fsm));
    fsm.addState(new MoveState(fsm));
    fsm.addState(new AttackState(fsm));
    fsm.addState(new DeadState(fsm));
    
    // 设置初始状态
    fsm.changeState("Idle");
    
    return fsm;
}

/**
 * 测试状态机
 */
export function testFSM(): void {
    console.log("========== 开始测试FSM ==========");
    
    const fsm = createCharacterFSM();
    
    // 测试状态切换
    console.log("\n--- 测试1: 从待机到移动 ---");
    fsm.changeState("Move", { speed: 5 });
    
    console.log("\n--- 测试2: 从移动到攻击 ---");
    fsm.changeState("Attack");
    
    // 等待攻击状态自动结束
    setTimeout(() => {
        console.log("\n--- 测试3: 攻击结束后返回待机 ---");
        console.log(`当前状态: ${fsm.getCurrentStateName()}`);
        
        console.log("\n--- 测试4: 角色死亡 ---");
        fsm.changeState("Dead");
        
        console.log("\n========== FSM测试完成 ==========");
    }, 1500);
}

// ========== 示例2: 简单的游戏状态机 ==========

class MenuState extends BaseState {
    constructor(fsm: FSM) {
        super(fsm, "Menu");
    }
    
    onEnter(params?: any): void {
        super.onEnter(params);
        console.log("显示主菜单");
    }
}

class PlayingState extends BaseState {
    constructor(fsm: FSM) {
        super(fsm, "Playing");
    }
    
    onEnter(params?: any): void {
        super.onEnter(params);
        console.log("游戏开始");
    }
    
    onUpdate(dt: number): void {
        // 游戏主循环
    }
}

class PausedState extends BaseState {
    constructor(fsm: FSM) {
        super(fsm, "Paused");
    }
    
    onEnter(params?: any): void {
        super.onEnter(params);
        console.log("游戏暂停");
    }
}

/**
 * 创建游戏状态机
 */
export function createGameFSM(): FSM {
    const fsm = new FSM();
    
    fsm.addState(new MenuState(fsm));
    fsm.addState(new PlayingState(fsm));
    fsm.addState(new PausedState(fsm));
    
    fsm.changeState("Menu");
    
    return fsm;
}
