-- FS25_AD_CP_Zubringer - Konfiguration
-- Hier alles anpassen, was zu eurem Setup passt.

ADCP = ADCP or {}

-- Log-Stufen:
-- 0 = nur Warnungen/Fehler (Standard, ruhiger Log)
-- 1 = wichtige Statusmeldungen
-- 2 = volle Diagnose fuer Fehlersuche
ADCP.LOG_LEVEL = 0

-- Die sichtbare Courseplay-Einstellung "Geraet auffuellen" darf beliebig
-- gesetzt sein. Waehrend relevanter Feldarbeit verwendet die Mod intern
-- voruebergehend "Warten" und stellt den Benutzerwert danach wieder her.

-- Welche Fülltypen lösen die "Ausbringer ist leer"-Meldung aus?
-- Namen müssen exakt den FillType-Namen aus eurer fillTypes.xml entsprechen.
-- LIQUIDMANURE = Gülle, DIGESTATE = Gärreste (beide vanilla FS25 FillTypes)
ADCP.MONITORED_FILLTYPES = {
    "LIQUIDMANURE",
    "DIGESTATE",
}

-- Ab welchem Füllstand (Liter) gilt der Ausbringer als "leer"?
-- Kleiner Puffer statt exakt 0, wegen Rundungsfehlern.
ADCP.EMPTY_THRESHOLD_LITERS = 2

-- CP erst wieder freigeben, wenn der Ausbringer praktisch voll ist.
ADCP.RESUME_FILL_PERCENT = 1.0

-- Wie oft (ms) wird der Füllstand der arbeitenden CP-Fahrzeuge geprüft?
ADCP.CHECK_INTERVAL_MS = 1000

-- Zielabstand (m) zwischen Zubringer und Ausbringer beim Andocken.
-- Muss so gewählt sein, dass das Übergabegerät (Schlauch/Arm) das andere
-- Fahrzeug noch erreicht. Muss ggf. je nach Fahrzeuggröße angepasst werden.
ADCP.DOCKING_DISTANCE = 5.5

-- Kein Vorlauf entlang der Fahrtrichtung: Der Treffpunkt bleibt im Feld
-- direkt seitlich neben dem Ausbringer.
ADCP.APPROACH_FORWARD_OFFSET_M = 0.0

-- Umladerate in Liter/Sekunde beim Überladen Zubringer -> Ausbringer.
-- Rein spielerisch/visuell, damit es nicht "teleportiert" wirkt.
ADCP.TRANSFER_RATE_L_PER_S = 8500

-- Maximale Zeit (ms), die eine Andock-Fahrt dauern darf, bevor abgebrochen wird.
ADCP.MAX_DOCKING_TIME_MS = 180000

-- Wie lange (ms) muss ein Zubringer im Abholen&Anliefern-Modus durchgehend
-- stillstehen, bevor er als "wartet auf Ruf" gilt? Ersetzt die fruehere
-- Abstandspruefung zur zweiten Marke (die ADGraphManager brauchte, was aus
-- unserem Mod-Skript heraus nicht zuverlaessig sichtbar war).
ADCP.STILLSTAND_REQUIRED_MS = 8000

-- Welche vehicleTypes (siehe modDesc.xml <vehicle type="..."> der jeweiligen
-- Fahrzeuge, NICHT die Spezialisierung) gelten als Zubringer-Fahrzeug?
-- Kleinschreibung wird beim Vergleich ignoriert.
ADCP.SUPPLY_VEHICLE_TYPES = {
    "manureTrailer",
    "waterTrailer",
    "manureBarrel",
    "selfPropelledManureBarrel",
}

-- Wert aus FS25_AutoDrive/scripts/AutoDrive.lua: "AutoDrive.MODE_PICKUPANDDELIVER = 2".
-- Bewusst hier als eigene Konstante hartkodiert statt zur Laufzeit "AutoDrive.MODE_PICKUPANDDELIVER"
-- zu lesen: das globale AutoDrive-Table war aus unserem Mod-Skript heraus
-- zur Laufzeit nicht zuverlaessig sichtbar (siehe Log: "AutoDrive-Global
-- ist an dieser Stelle nil"), was die Zubringer-Erkennung permanent
-- blockiert hat. Falls AD diesen Wert in einer kuenftigen Version aendert,
-- muss er hier manuell nachgezogen werden.
ADCP.AD_MODE_PICKUPANDDELIVER = 2

-- Der AD-Zubringer behaelt seine normalen AutoDrive-Geschwindigkeiten.
-- Dieses Mod setzt waehrend Anfahrt und Rueckweg kein kuenstliches Limit.

-- Wie lange (ms) haelt ein einzelner CP-hold()-Aufruf an, bevor er
-- automatisch wieder auslaeuft? Wird periodisch aufgefrischt, solange der
-- Ausbringer auf den Zubringer wartet - muss also deutlich laenger sein als
-- ADCP.CHECK_INTERVAL_MS (die Auffrischrate), sonst faehrt CP kurz weiter.
ADCP.HOLD_REFRESH_MS = 5000
-- Sicherheitswartezeit nach Beginn des Einklappens, bevor der AD-Zubringer
-- gerufen wird. Das vermeidet die unzuverlaessige getIsUnfolded()-Sperre,
-- die bei manchen Mod-Geraeten nie den erwarteten Endzustand meldet.
ADCP.FOLDING_GRACE_MS = 8000

-- Kurze Beruhigungsphase: erst Arbeitsgeraete anheben, dann einklappen.
-- Verhindert das ruppige gleichzeitige Anhalten/Anheben/Einklappen.
ADCP.FOLD_START_DELAY_MS = 1500


function ADCP.debugPrint(fmt, ...)
    local message = string.format(fmt, ...)

    if string.sub(message, 1, 7) == "FEHLER:" then
        Logging.error("[AD-CP Zubringer] %s", string.sub(message, 9))
        return
    end

    if string.sub(message, 1, 8) == "WARNUNG:" then
        Logging.warning("[AD-CP Zubringer] %s", string.sub(message, 10))
        return
    end

    local level = 1
    if string.find(message, "DIAGNOSE", 1, true) ~= nil then
        level = 2
    end

    if (ADCP.LOG_LEVEL or 0) >= level then
        Logging.info("[AD-CP Zubringer] %s", message)
    end
end

function ADCP.diagPrint(fmt, ...)
    if (ADCP.LOG_LEVEL or 0) >= 2 then
        Logging.info("[AD-CP DIAG] " .. string.format(fmt, ...))
    end
end

-- Mindestabstand, den der AD-Zubringer nach dem Umladen vorwaerts gewinnen muss.
-- Nach dem Umladen faehrt der Zubringer zunaechst kontrolliert geradeaus,
-- bevor AutoDrive seine normale Route zur Beladestelle wieder uebernimmt.
ADCP.SUPPLIER_CLEAR_FORWARD_DISTANCE_M = 12.0
ADCP.SUPPLIER_CLEAR_FORWARD_SPEED_KMH = 20.0

-- Nur waehrend der Freifahrt nach dem Umladen vergroessert der Zubringer
-- seinen seitlichen Abstand. Die eigentliche Andock-/Ueberladeposition bleibt
-- unveraendert.
ADCP.SUPPLIER_CLEAR_SIDE_OFFSET_M = 4.0

-- Da der Zubringer durch die Freifahrphase bereits gerade vom Ausbringer
-- wegfaehrt, genuegt anschliessend ein kleinerer Sicherheitsabstand.
ADCP.SUPPLIER_DEPARTURE_DISTANCE_M = 6.0

-- Nach dem Sicherheitsabstand setzt der Ausbringer vor dem Ausklappen kurz
-- gerade rueckwaerts. Diese Fahrt steuert ausschliesslich unser Mod; CP bleibt
-- bis zum Ende der 5 m gehalten und wird erst danach wieder freigegeben.
ADCP.WORKER_REVERSE_DISTANCE_M = 5.0
ADCP.WORKER_REVERSE_SPEED_KMH = 5.0

-- Wie lange (ms) wird ein Zubringer nach einem fehlgeschlagenen Andockversuch
-- bei der Auswahl uebersprungen? Verhindert, dass immer wieder derselbe
-- (meist naechstgelegene, aber gerade gescheiterte) Zubringer gewaehlt wird,
-- obwohl ein zweiter, verfuegbarer Zubringer bereitsteht.
ADCP.SUPPLIER_FAIL_COOLDOWN_MS = 120000
