import { DungeonDatabase, DungeonTheme, DungeonDifficulty, RoomType, RoomStatus, DungeonStatus, WaveStatus } from '../types/dungeon.types';
import { CHARACTER_DEFAULTS } from '../types/character.types';
import { Item, ItemType, ItemRarity } from '../types/item.types';
import { StatusEffect } from '../types/combat.types';

// Fonction helper pour créer un ennemi basé sur un template de personnage
const createEnemy = (baseType: string, level: number = 1) => {
    const base = CHARACTER_DEFAULTS[baseType];
    return {
        ...base,
        level,
        id: undefined,
        experience: 0
    };
};

// Items de récompense communs
const commonRewards: Item[] = [
    {
        id: '1',
        name: 'Health Potion',
        description: 'Restore 50 vitality',
        type: 'consumable',
        rarity: 'common',
        level: 1,
        effects: [{
            trigger: 'onUse',
            effect: {
                type: 'hot',
                stat: 'vitality',
                value: 50,
                duration: 1,
                source: 'item'
            }
        }],
        price: 100,
        stackable: true,
        maxStack: 10
    },
    {
        id: '2',
        name: 'Mana Potion',
        description: 'Restaure une partie des points de mana',
        type: 'consumable',
        rarity: 'common',
        level: 1,
        effects: [{
            trigger: 'onUse',
            effect: {
                type: 'hot',
                stat: 'intelligence',
                value: 50,
                duration: 1,
                source: 'item'
            }
        }],
        price: 100,
        stackable: true,
        maxStack: 10
    }
];

// Fonction helper pour créer un item d'équipement
const createEquipment = (id: string, name: string, type: ItemType, rarity: ItemRarity, effects: StatusEffect[]): Item => ({
    id,
    name,
    description: `${name} - ${rarity} ${type}`,
    type,
    rarity,
    level: 1,
    effects: effects.map(effect => ({
        trigger: 'onEquip',
        effect
    })),
    price: rarity === 'epic' ? 1000 : rarity === 'rare' ? 500 : 200,
    stackable: false
});

export const DUNGEON_DEFAULTS: Record<string, DungeonDatabase> = {
    // Donjon de la Grotte des Débutants
    cave: {
        id: '',
        theme: DungeonTheme.CAVE,
        difficulty: DungeonDifficulty.EASY,
        status: DungeonStatus.WAITING,
        currentRoom: 0,
        currentWave: 0,
        totalRooms: 3,
        totalWaves: 3,
        party: [],
        combatHistory: [],
        completed: false,
        createdAt: new Date(),
        startedAt: new Date(),
        createdById: '',
        rooms: [
            {
                id: 'room1',
                dungeonId: '',
                type: RoomType.COMBAT,
                roomNumber: 1,
                status: RoomStatus.PENDING,
                completed: false,
                description: 'Une petite grotte faiblement éclairée',
                createdAt: new Date(),
                waves: [
                    {
                        id: 'wave1',
                        roomId: 'room1',
                        waveNumber: 1,
                        status: WaveStatus.PENDING,
                        enemies: [createEnemy('skeleton', 1)],
                        rewards: commonRewards,
                        completed: false,
                        createdAt: new Date()
                    }
                ]
            },
            {
                id: 'room2',
                dungeonId: '',
                type: RoomType.COMBAT,
                roomNumber: 2,
                status: RoomStatus.PENDING,
                completed: false,
                description: 'Une caverne avec des cristaux lumineux',
                createdAt: new Date(),
                waves: [
                    {
                        id: 'wave2',
                        roomId: 'room2',
                        waveNumber: 1,
                        status: WaveStatus.PENDING,
                        enemies: [
                            createEnemy('skeleton', 1),
                            createEnemy('skeleton_archer', 1)
                        ],
                        rewards: [
                            ...commonRewards,
                            createEquipment('3', 'Crystal Shard', 'material', 'uncommon', [])
                        ],
                        completed: false,
                        createdAt: new Date()
                    }
                ]
            },
            {
                id: 'room3',
                dungeonId: 'cave',
                type: RoomType.BOSS,
                roomNumber: 3,
                status: RoomStatus.PENDING,
                completed: false,
                description: 'La chambre du boss, un grand espace avec un trône de pierre',
                createdAt: new Date(),
                waves: [
                    {
                        id: 'wave3',
                        roomId: 'room3',
                        waveNumber: 1,
                        status: WaveStatus.PENDING,
                        enemies: [
                            createEnemy('skeleton', 1),
                            createEnemy('armored_skeleton', 1),
                            createEnemy('skeleton_archer', 1)
                        ],
                        rewards: [
                            ...commonRewards,
                            createEquipment('4', 'Knight\'s Shield', 'armor', 'rare', [{
                                type: 'buff',
                                stat: 'vitality',
                                value: 10,
                                duration: -1,
                                source: 'equipment'
                            }])
                        ],
                        completed: false,
                        createdAt: new Date()
                    }
                ]
            }
        ]
    },

    // Forêt Mystique
    forest: {
        id: '',
        theme: DungeonTheme.FOREST,
        difficulty: DungeonDifficulty.MEDIUM,
        status: DungeonStatus.WAITING,
        currentRoom: 0,
        currentWave: 0,
        totalRooms: 4,
        totalWaves: 5,
        party: [],
        combatHistory: [],
        completed: false,
        createdAt: new Date(),
        startedAt: new Date(),
        createdById: '',
        rooms: [
            {
                id: 'room1',
                dungeonId: 'forest',
                type: RoomType.COMBAT,
                roomNumber: 1,
                status: RoomStatus.PENDING,
                completed: false,
                description: 'Une clairière brumeuse',
                createdAt: new Date(),
                waves: [
                    {
                        id: 'wave1',
                        roomId: 'room1',
                        waveNumber: 1,
                        status: WaveStatus.PENDING,
                        enemies: [
                            createEnemy('archer', 2),
                            createEnemy('archer', 2)
                        ],
                        rewards: commonRewards,
                        completed: false,
                        createdAt: new Date()
                    }
                ]
            },
            {
                id: 'room2',
                dungeonId: 'forest',
                type: RoomType.COMBAT,
                roomNumber: 2,
                status: RoomStatus.PENDING,
                completed: false,
                description: 'Un bosquet enchanté',
                createdAt: new Date(),
                waves: [
                    {
                        id: 'wave2',
                        roomId: 'room2',
                        waveNumber: 1,
                        status: WaveStatus.PENDING,
                        enemies: [
                            createEnemy('priest', 2),
                            createEnemy('swordsman', 2)
                        ],
                        rewards: commonRewards,
                        completed: false,
                        createdAt: new Date()
                    },
                    {
                        id: 'wave3',
                        roomId: 'room2',
                        waveNumber: 2,
                        status: WaveStatus.PENDING,
                        enemies: [
                            createEnemy('archer', 2),
                            createEnemy('priest', 2)
                        ],
                        rewards: [
                            ...commonRewards,
                            createEquipment('5', 'Enchanted Bow', 'weapon', 'rare', [{
                                type: 'buff',
                                stat: 'strength',
                                value: 5,
                                duration: -1,
                                source: 'equipment'
                            }])
                        ],
                        completed: false,
                        createdAt: new Date()
                    }
                ]
            },
            {
                id: 'room3',
                dungeonId: 'forest',
                type: RoomType.ELITE,
                roomNumber: 3,
                status: RoomStatus.PENDING,
                completed: false,
                description: 'Le sanctuaire des gardiens',
                createdAt: new Date(),
                waves: [
                    {
                        id: 'wave4',
                        roomId: 'room3',
                        waveNumber: 1,
                        status: WaveStatus.PENDING,
                        enemies: [
                            createEnemy('knight', 3),
                            createEnemy('priest', 3)
                        ],
                        rewards: [
                            ...commonRewards,
                            createEquipment('6', 'Guardian\'s Amulet', 'armor', 'rare', [
                                {
                                    type: 'buff',
                                    stat: 'strength',
                                    value: 3,
                                    duration: -1,
                                    source: 'equipment'
                                },
                                {
                                    type: 'buff',
                                    stat: 'agility',
                                    value: 3,
                                    duration: -1,
                                    source: 'equipment'
                                },
                                {
                                    type: 'buff',
                                    stat: 'intelligence',
                                    value: 3,
                                    duration: -1,
                                    source: 'equipment'
                                }
                            ])
                        ],
                        completed: false,
                        createdAt: new Date()
                    }
                ]
            },
            {
                id: 'room4',
                dungeonId: 'forest',
                type: RoomType.BOSS,
                roomNumber: 4,
                status: RoomStatus.PENDING,
                completed: false,
                description: 'L\'arbre ancestral',
                createdAt: new Date(),
                waves: [
                    {
                        id: 'wave5',
                        roomId: 'room4',
                        waveNumber: 1,
                        status: WaveStatus.PENDING,
                        enemies: [
                            createEnemy('knight', 4),
                            createEnemy('priest', 4),
                            createEnemy('archer', 4)
                        ],
                        rewards: [
                            ...commonRewards,
                            createEquipment('7', 'Ancient Tree Core', 'material', 'epic', []),
                            createEquipment('8', 'Forest Guardian\'s Blade', 'weapon', 'epic', [
                                {
                                    type: 'buff',
                                    stat: 'strength',
                                    value: 10,
                                    duration: -1,
                                    source: 'equipment'
                                },
                                {
                                    type: 'buff',
                                    stat: 'agility',
                                    value: 5,
                                    duration: -1,
                                    source: 'equipment'
                                }
                            ])
                        ],
                        completed: false,
                        createdAt: new Date()
                    }
                ]
            }
        ]
    }
}; 