import { CharacterInDungeon, ResourcesType } from './character.types';
import { Stats } from './stats.types';

export type ActionType = 'attack' | 'combo' | 'special' | 'item';

export interface CombatContext {
    turnNumber: number;
    roomIndex: number;
    waveIndex: number;
    dungeonId: string;
}

export interface Action {
    type: ActionType;
    actor: string; // ID de l'entité qui effectue l'action
    targets: string[]; // IDs des cibles
    value: number; // Dégâts/Soins/etc
    effects?: StatusEffect[];
}

export interface StatusEffect {
    type: 'buff' | 'debuff' | 'dot' | 'hot';
    stat: keyof Stats;
    value: number;
    duration: number;
    source: string; // ID de la source de l'effet
}

export interface TurnInfo {
    round: number;
    activeEntity: string;
    availableActions: ActionType[];
    timeline: string[]; // Ordre des tours
}

export interface TargetingCriteria {
    healthThreshold?: number;
    preferredTargets?: string[];
    excludedTargets?: string[];
    targetCount: number;
    targetCondition?: (target: CharacterInDungeon) => boolean;
}

export interface ActionConditions {
    resourceCost?: number;
    resourceType?: ResourcesType;
    cooldown?: boolean;
    customCondition?: (character: CharacterInDungeon) => boolean;
}

export interface ActionStrategy {
    type: CombatActionType;
    conditions: ActionConditions;
    targeting: TargetingCriteria;
    priority: number;
}

export enum CombatActionType {
    ATTACK = 'attack',
    HEAL = 'heal',
    ITEM = 'item',
    COMBO = 'combo',
    SPECIAL = 'special',
    DEATH = 'death',
    WAVE_COMPLETE = 'wave_complete',
    ROOM_COMPLETE = 'room_complete',
    DUNGEON_COMPLETE = 'dungeon_complete',
    DUNGEON_FAILED = 'dungeon_failed'
}

export interface CombatResources {
    health: number;
    maxHealth: number;
    mana: number;
    maxMana: number;
}

export interface CombatRewards {
    experience?: number;
    gold?: number;
    items?: string[];
}

export interface CombatAction {
    type: CombatActionType;
    sourceId: string;
    targetId?: string;
    damage?: number;
    isCritical?: boolean;
    timestamp?: Date;
    resources?: CombatResources;
    effects?: string[];
    rewards?: CombatRewards;
    turnNumber: number;
    roomNumber: number;
    waveNumber: number;
    dungeonId: string;
}

export interface CombatTurn {
    turnNumber: number;
    roomNumber: number;
    waveNumber: number;
    actions: CombatAction[];
    timestamp: Date;
}
