// cas_repeatspeech
// Listens for PC chat, confirms, then repeats/routes the message with debug.

void SpeakDelayed(object oWho, string sMsg, float fDelay)
{
    if (!GetIsObjectValid(oWho) || sMsg == "") return;
    DelayCommand(fDelay, AssignCommand(oWho, SpeakString(sMsg)));
}

object GetFirstInSameAreaByTag(string sTag, object oRef)
{
    object oArea = GetArea(oRef);
    object oT = GetObjectByTag(sTag);
    int i = 1;
    while (GetIsObjectValid(oT) && GetArea(oT) != oArea)
    {
        oT = GetObjectByTag(sTag, i);
        i++;
    }
    if (GetIsObjectValid(oT) && GetArea(oT) == oArea) return oT;
    return OBJECT_INVALID;
}

void main()
{
    // Ensure the listener is actually listening (harmless if already TRUE)
    if (!GetIsListening(OBJECT_SELF))
    {
        SetListening(OBJECT_SELF, TRUE);
    }

    object oPC   = GetPCChatSpeaker();
    string sText = GetPCChatMessage();

    if (!GetIsObjectValid(oPC)) return;

    // If nothing came through, tell the PC and bail
    if (sText == "")
    {
        SendMessageToPC(oPC, "[cas_repeatspeech] Fired, but captured EMPTY text.");
        return;
    }

    string sSendTo = GetLocalString(OBJECT_SELF, "sSEND_TO");

    // Baseline debug: who, what, and routing
    SendMessageToPC(oPC, "[cas_repeatspeech] Listener Tag=" + GetTag(OBJECT_SELF));
    SendMessageToPC(oPC, "[cas_repeatspeech] Captured text: \"" + sText + "\"");
    SendMessageToPC(oPC, "[cas_repeatspeech] Routing mode sSEND_TO=\"" + sSendTo + "\"");

    // Immediate confirmation from the listener
    SpeakDelayed(OBJECT_SELF, "I heard " + sText, 0.1f);

    // Route or echo the original text.
    if (sSendTo == "FROM_HOLE")
    {
        object oTarget = GetFirstInSameAreaByTag("CAS_FROM_HOLE", OBJECT_SELF);
        if (GetIsObjectValid(oTarget))
        {
            SendMessageToPC(oPC, "[cas_repeatspeech] Routing to CAS_FROM_HOLE -> " +
                                  GetTag(oTarget) + " (" + GetName(oTarget) + ")");
            SpeakDelayed(oTarget, sText, 0.1f);
        }
        else
        {
            SendMessageToPC(oPC, "[cas_repeatspeech] CAS_FROM_HOLE NOT FOUND in same area. Speaking from listener.");
            SpeakDelayed(OBJECT_SELF, sText, 0.1f);
        }
        return;
    }
    else if (sSendTo == "INTO_HOLE")
    {
        object oTarget = GetFirstInSameAreaByTag("CAS_INTO_HOLE", OBJECT_SELF);
        if (GetIsObjectValid(oTarget))
        {
            SendMessageToPC(oPC, "[cas_repeatspeech] Routing to CAS_INTO_HOLE -> " +
                                  GetTag(oTarget) + " (" + GetName(oTarget) + ")");
            SpeakDelayed(oTarget, sText, 0.1f);
        }
        else
        {
            SendMessageToPC(oPC, "[cas_repeatspeech] CAS_INTO_HOLE NOT FOUND in same area. Speaking from listener.");
            SpeakDelayed(OBJECT_SELF, sText, 0.1f);
        }
        return;
    }

    // Default: listener repeats it as well.
    SendMessageToPC(oPC, "[cas_repeatspeech] No routing. Listener will repeat.");
    SpeakDelayed(OBJECT_SELF, sText, 0.1f);
}
