"""
Reads the 'Effect' binary record — the single most-reused structure in Mids
Reborn's database. Every power's Effects[] array is a list of these, and every
enhancement's optional proc/special effect (Enhancement.Effect[i].FX) is one too.

Field order/types verified against MidsReborn/Core/Base/Data_Classes/Effect.cs,
constructor `public Effect(BinaryReader reader)` (source line ~87) and its
mirror `StoreTo` (source line ~1626) in the LoadedCamel/MidsReborn repo.
"""
from enums import (
    E_EFFECT_CLASS, E_EFFECT_TYPE, E_DAMAGE, E_MEZ, E_STACKING, E_SUPPRESS_FLAGS,
    E_SPECIAL_CASE, E_OVERRIDE_BOOLEAN, E_PVX, E_TO_WHO, E_ATTRIB_TYPE, E_ASPECT,
    E_EFFECT_AREA, E_POWER_ATTRIBS, name_of, flags_of,
)


def read_effect(r):
    d = {}
    d["power_full_name"] = r.read_string()
    d["unique_id"] = r.read_int32()
    d["effect_class"] = name_of(E_EFFECT_CLASS, r.read_int32())
    d["effect_type"] = name_of(E_EFFECT_TYPE, r.read_int32())
    d["damage_type"] = name_of(E_DAMAGE, r.read_int32())
    d["mez_type"] = name_of(E_MEZ, r.read_int32())
    d["et_modifies"] = name_of(E_EFFECT_TYPE, r.read_int32())
    d["summon"] = r.read_string()
    d["delayed_time"] = r.read_single()
    d["ticks"] = r.read_int32()
    d["stacking"] = name_of(E_STACKING, r.read_int32())
    d["base_probability"] = r.read_single()
    suppression_raw = r.read_int32()
    d["suppression"] = flags_of(E_SUPPRESS_FLAGS, suppression_raw)
    d["buffable"] = r.read_boolean()
    d["resistible"] = r.read_boolean()
    d["special_case"] = name_of(E_SPECIAL_CASE, r.read_int32())
    d["variable_modified_override"] = r.read_boolean()
    d["ignore_scaling"] = r.read_boolean()
    d["pv_mode"] = name_of(E_PVX, r.read_int32())
    d["to_who"] = name_of(E_TO_WHO, r.read_int32())
    d["display_percentage_override"] = name_of(E_OVERRIDE_BOOLEAN, r.read_int32())
    d["scale"] = r.read_single()
    d["magnitude"] = r.read_single()
    d["duration"] = r.read_single()
    d["attrib_type"] = name_of(E_ATTRIB_TYPE, r.read_int32())
    d["aspect"] = name_of(E_ASPECT, r.read_int32())
    d["modifier_table"] = r.read_string()
    d["near_ground"] = r.read_boolean()
    d["cancel_on_miss"] = r.read_boolean()
    d["requires_to_hit_check"] = r.read_boolean()
    d["uid_class_name"] = r.read_string()
    d["nid_class_name"] = r.read_int32()

    d["expr_duration"] = r.read_string()
    d["expr_magnitude"] = r.read_string()
    d["expr_probability"] = r.read_string()

    d["reward"] = r.read_string()
    d["effect_id"] = r.read_string()
    d["ignore_ed"] = r.read_boolean()
    d["override"] = r.read_string()
    d["procs_per_minute"] = r.read_single()
    d["power_attribs"] = name_of(E_POWER_ATTRIBS, r.read_int32())

    d["attr_orig_accuracy"] = r.read_single()
    d["attr_orig_activate_period"] = r.read_single()
    d["attr_orig_arc"] = r.read_int32()
    d["attr_orig_cast_time"] = r.read_single()
    d["attr_orig_effect_area"] = name_of(E_EFFECT_AREA, r.read_int32())
    d["attr_orig_endurance_cost"] = r.read_single()
    d["attr_orig_interrupt_time"] = r.read_single()
    d["attr_orig_max_targets"] = r.read_int32()
    d["attr_orig_radius"] = r.read_single()
    d["attr_orig_range"] = r.read_single()
    d["attr_orig_recharge_time"] = r.read_single()
    d["attr_orig_secondary_range"] = r.read_single()

    d["attr_mod_accuracy"] = r.read_single()
    d["attr_mod_activate_period"] = r.read_single()
    d["attr_mod_arc"] = r.read_int32()
    d["attr_mod_cast_time"] = r.read_single()
    d["attr_mod_effect_area"] = name_of(E_EFFECT_AREA, r.read_int32())
    d["attr_mod_endurance_cost"] = r.read_single()
    d["attr_mod_interrupt_time"] = r.read_single()
    d["attr_mod_max_targets"] = r.read_int32()
    d["attr_mod_radius"] = r.read_single()
    d["attr_mod_range"] = r.read_single()
    d["attr_mod_recharge_time"] = r.read_single()
    d["attr_mod_secondary_range"] = r.read_single()

    conditional_count = r.read_int32()
    conditionals = []
    for _ in range(conditional_count):
        key = r.read_string()
        value = r.read_string()
        conditionals.append({"key": key, "value": value})
    d["active_conditionals"] = conditionals

    return d
