import { ModifiableDataBaseTotal, ResourceDataBaseTotalMax } from "../common/common-data";
import {
    DS4ActorDataHelper,
    DS4CharacterDataDataBaseInfo,
    DS4CharacterDataDataCurrency,
    DS4CharacterDataDataLanguage,
    DS4CharacterDataDataProfile,
    DS4CharacterDataDataProgression,
    DS4CreatureDataDataBaseInfo,
} from "./actor-data";

export type DS4ActorPreparedData = DS4CharacterPreparedData | DS4CreaturePreparedData;

type DS4CharacterPreparedData = DS4ActorDataHelper<DS4CharacterPreparedDataData, "character">;
type DS4CreaturePreparedData = DS4ActorDataHelper<DS4CreaturePreparedDataData, "creature">;

// templates

interface DS4ActorPreparedDataDataBase {
    attributes: DS4ActorPreparedDataDataAttributes;
    traits: DS4ActorPreparedDataDataTraits;
    combatValues: DS4ActorPreparedDataDataCombatValues;
    rolling: DS4ActorPreparedDataDataRolling;
}

interface DS4ActorPreparedDataDataAttributes {
    body: ModifiableDataBaseTotal<number>;
    mobility: ModifiableDataBaseTotal<number>;
    mind: ModifiableDataBaseTotal<number>;
}

interface DS4ActorPreparedDataDataTraits {
    strength: ModifiableDataBaseTotal<number>;
    constitution: ModifiableDataBaseTotal<number>;
    agility: ModifiableDataBaseTotal<number>;
    dexterity: ModifiableDataBaseTotal<number>;
    intellect: ModifiableDataBaseTotal<number>;
    aura: ModifiableDataBaseTotal<number>;
}

interface DS4ActorPreparedDataDataCombatValues {
    hitPoints: ResourceDataBaseTotalMax<number>;
    defense: ModifiableDataBaseTotal<number>;
    initiative: ModifiableDataBaseTotal<number>;
    movement: ModifiableDataBaseTotal<number>;
    meleeAttack: ModifiableDataBaseTotal<number>;
    rangedAttack: ModifiableDataBaseTotal<number>;
    spellcasting: ModifiableDataBaseTotal<number>;
    targetedSpellcasting: ModifiableDataBaseTotal<number>;
}

interface DS4ActorPreparedDataDataRolling {
    maximumCoupResult: number;
    minimumFumbleResult: number;
}

// types

interface DS4CharacterPreparedDataData extends DS4ActorPreparedDataDataBase {
    baseInfo: DS4CharacterDataDataBaseInfo;
    progression: DS4CharacterDataDataProgression;
    language: DS4CharacterDataDataLanguage;
    profile: DS4CharacterDataDataProfile;
    currency: DS4CharacterDataDataCurrency;
}

interface DS4CreaturePreparedDataData extends DS4ActorPreparedDataDataBase {
    baseInfo: DS4CreatureDataDataBaseInfo;
}