-- ╔══════════════════════════════════════════════════════════════╗
-- ║                    A G E N C Y   W A T C H                    ║
-- ║                        AgencyOS 26.5                          ║
-- ║   Kostenlos von Agency Scripts  ·  discord.gg/RTax3aBMUs      ║
-- ║                       shop.agencyg.de                         ║
-- ╠══════════════════════════════════════════════════════════════╣
-- ║  Alles hier ist ohne Programmierkenntnisse anpassbar.        ║
-- ║  Abschnitte: ALLGEMEIN · STEUERUNG · GEGENSTAND · ANZEIGE ·  ║
-- ║              THEME · SPERRE · ZIFFERBLAETTER · APPS ·        ║
-- ║              PHONE · PRO · TEXTE                             ║
-- ╚══════════════════════════════════════════════════════════════╝

Config = {}

-- ═══════════════════════════════════════════════════════════════
--  1  ALLGEMEIN
-- ═══════════════════════════════════════════════════════════════
Config.Framework = 'auto'        -- 'auto' | 'qb' | 'esx' | 'standalone'
Config.Locale    = 'en'          -- Voreinstellung. Alle Codes siehe SprachListe in shared/sprachen.lua
Config.Debug     = false         -- Zusatzmeldungen in der Konsole

-- ═══════════════════════════════════════════════════════════════
--  2  STEUERUNG
--  Die Uhr ist nur auf Tastendruck da, genau wie das Agency Phone.
-- ═══════════════════════════════════════════════════════════════
Config.OpenKey       = 'Z'         -- Voreingestellte Taste (im Spiel umbelegbar)
Config.OpenCommand   = 'watch'     -- /watch  oeffnet und schliesst die Uhr
Config.ToggleMiniCmd = 'watchmini' -- /watchmini  schaltet die kleine Dauer-Anzeige
Config.CloseOnEscape = true        -- ESC schliesst die Uhr
Config.OpenSound     = true        -- Ton beim Oeffnen und Schliessen

-- Bedienelemente am Gehaeuse:
--   Krone (rechts oben) = App-Liste, Mausrad darauf = blaettern
--   Seitenknopf (darunter) = Kontrollzentrum
--   Aktionstaste (orange, links) = frei belegbar, siehe unten
--
-- Auf der Aktionstaste liegt IMMER etwas. Eine Taste, die nichts tut, ist
-- schlimmer als gar keine - der Spieler weiss dann nicht, ob sie kaputt ist
-- oder er sie falsch bedient. Steht hier ein unbekannter Name, faellt die
-- Uhr auf die Taschenlampe zurueck.
--
-- Die Beschriftungen stehen hier auf Englisch, weil sie damit uebersetzt
-- werden: solange der englische Standard hier steht, nimmt die Uhr den Text
-- aus shared/sprachen.lua in der eingestellten Sprache. Wer hier etwas
-- anderes eintraegt, behaelt genau seinen Text, in jeder Sprache. Dieselbe
-- Regel gilt fuer Config.Apps, Config.Themes und Config.Komplikationen.
Config.ActionButton  = 'lampe'
Config.ActionPresets = {
    lampe    = { label = 'Flashlight',       icon = 'lampe',    kind = 'builtin', value = 'lampe' },
    wegpunkt = { label = 'Clear waypoint',   icon = 'pin',      kind = 'builtin', value = 'wegpunkt' },
    mini     = { label = 'Mini display',     icon = 'raster',   kind = 'builtin', value = 'mini' },
    kz       = { label = 'Control Centre',   icon = 'regler',   kind = 'builtin', value = 'kz' },
    pay      = { label = 'Agency Pay',       icon = 'karte',    kind = 'builtin', value = 'pay' },
    -- Beispiele fuer Server-Betreiber (auskommentiert): eigene Befehle und Events
    -- motor  = { label = 'Motor an/aus',    icon = 'blitz',    kind = 'command', value = 'engine' },
    -- winken = { label = 'Winken',          icon = 'hand',     kind = 'command', value = 'e wave' },
    -- eigen  = { label = 'Eigenes Event',   icon = 'blitz',    kind = 'event',   value = 'mein-script:client:aktion' },
}

-- Taschenlampe. Sie leuchtet zweifach: das Zifferblatt wird zur weissen
-- Flaeche - so hat es eine Uhr am Handgelenk an sich - und zusaetzlich faellt
-- ein Kegel in die Welt, sonst saehe man im Dunkeln trotzdem nichts.
Config.Lampe = {
    -- Reichweite und Helligkeit des Kegels
    reichweite = 28.0,
    staerke    = 6.0,
    -- Ohne Uhr in der Hand aus: laeuft die Lampe weiter, waehrend die Uhr
    -- eingeklappt ist? true = ja, sie bleibt an bis zum naechsten Druck.
    weiterAusserhalb = true,
    -- Verfuegbare Leuchtarten. Durchgeschaltet wird auf der Uhr.
    arten = { 'weiss', 'blinken', 'rot' },
}

-- ═══════════════════════════════════════════════════════════════
--  3  GEGENSTAND
--  Ab Werk muss eine Uhr im Inventar liegen - irgendeine. Damit laeuft
--  das Script auf jedem Server sofort, ohne dass jemand erst ein neues
--  Item anlegen muss. Wer ein eigenes Item will, stellt auf 'exact' um.
-- ═══════════════════════════════════════════════════════════════
Config.RequireItem   = true         -- false = die Uhr geht immer auf

-- 'any'   = irgendeine Uhr aus Config.WatchItems reicht  (Voreinstellung)
-- 'exact' = nur Config.WatchItem wird akzeptiert
Config.ItemMode      = 'any'

-- Bekannte Uhr-Gegenstaende. Der erste, den der Spieler dabei hat, oeffnet
-- die Uhr. Eigene Namen einfach ergaenzen.
Config.WatchItems = {
    'rolex',            -- QBCore-Standard, heisst im Spiel "Goldene Uhr"
    'watch',
    'smartwatch',
    'agency_watch',
    'armbanduhr',
    'goldwatch',
    'silverwatch',
    'diamond_watch',
}

Config.WatchItem     = 'smartwatch' -- gilt nur bei Config.ItemMode = 'exact'
Config.Inventory     = 'auto'       -- 'auto' | 'ox' | 'qb' | 'none'
Config.RemoveOnDeath = false        -- Uhr nach dem Tod gesperrt bis zum Wiederbeleben

-- ═══════════════════════════════════════════════════════════════
--  4  ANZEIGE
--  Position und Groesse sind zusaetzlich in der Uhr selbst einstellbar.
-- ═══════════════════════════════════════════════════════════════
Config.AlwaysOn     = false           -- false = nur auf Tastendruck

-- Die kleine Dauer-Anzeige waechst mit der Uhr mit. Wer sie unabhaengig
-- kleiner oder groesser will, dreht hier: 1.0 = genauso gross wie die Uhr,
-- 0.7 = deutlich kleiner, 1.3 = groesser.
Config.MiniScale    = 1.0

-- Wo genau die kleine Anzeige sitzt. Sie steht am selben Bildrand wie in
-- Config.Position gewaehlt, aber mit eigenem Abstand - dort sitzt auf den
-- meisten Servern das HUD, und zwei Anzeigen uebereinander verdecken sich.
--   hoch  = Abstand zum oberen bzw. unteren Rand, in Prozent der Bildhoehe
--   seite = Abstand zum linken bzw. rechten Rand, in Prozent der Bildbreite
-- Ab Werk hoch genug, um ueber einem Tacho am unteren Rand zu bleiben.
Config.MiniAbstand  = { hoch = 19.0, seite = 2.4 }
Config.Position     = 'bottom-right'  -- bottom-left | bottom-right | top-left | top-right
Config.Size         = 1.5             -- Groesse, erlaubt sind 0.6 bis 2.0
Config.Appearance   = 'dark'          -- 'dark' | 'light'
Config.Use24h       = true
Config.DefaultFace  = 'raster'        -- siehe Abschnitt 7
Config.UpdateInterval = 1000          -- Millisekunden zwischen Aktualisierungen
Config.CountSteps   = true            -- eigener Schrittzaehler
Config.ShowSpeed    = true            -- Tachoanzeige im Fahrzeug
Config.HideInPauseMenu = true

-- ═══════════════════════════════════════════════════════════════
--  PRO-FASSUNG UND WERBUNG
--  Ohne Agency Phone: vollstaendige kostenlose Uhr mit dezentem Hinweis.
--  Mit erkanntem Agency Phone: Pro-Fassung, keine Werbung mehr.
-- ═══════════════════════════════════════════════════════════════
Config.ShowFreeBranding = true     -- Hinweis nur in der kostenlosen Fassung

-- ═══════════════════════════════════════════════════════════════
--  5  THEME — Metall-Voreinstellungen
-- ═══════════════════════════════════════════════════════════════
Config.Theme = 'titan'
Config.SplitFaceColor = '#00d4ff'  -- Akzentflaeche im Zifferblatt "Puls"

-- Grundfarben des Agency-Erscheinungsbilds. Werden an die Oberflaeche
-- durchgereicht und von den Benachrichtigungen der Uhr genutzt.
Config.AccentPrimary = '#00d4ff'
Config.AccentOrange  = '#ff6b35'
Config.AccentGreen   = '#00ff88'

-- case   = Gehaeuse, daraus wird die ganze Metallreihe abgeleitet
-- band   = Armband, eigene Reihe
-- accent = Systemfarbe der Oberflaeche
-- mesh   = true bei Metallgliedern, false bei einfarbigen Baendern
--
-- Die Toene sind auf die Beschreibung und auf die Agency-Palette abgestimmt:
-- Cyan #00d4ff und Orange #ff6b35 sind die Hausfarben, sie bleiben ueberall
-- der Bezugspunkt.
-- Beschriftungen wieder auf Englisch, damit sie uebersetzt werden. Siehe
-- den Hinweis bei Config.ActionPresets.
Config.Themes = {
    -- Warmgraues Titan, wie gebuerstetes Metall
    titan       = { label = 'Titanium',   case = '#b9b4a9', band = '#a9a49a', accent = '#00d4ff', orange = '#ff6b35', mesh = true  },
    -- Kuehles helles Silber
    silber      = { label = 'Silver',     case = '#dde0e4', band = '#c7cbd1', accent = '#00d4ff', orange = '#ff6b35', mesh = true  },
    -- Neutrales dunkles Grau
    graphit     = { label = 'Graphite',   case = '#44474e', band = '#383b42', accent = '#00d4ff', orange = '#ff7a30', mesh = true  },
    -- Fast schwarz mit dem Blaustich des Agency-Navy
    mitternacht = { label = 'Midnight',   case = '#1f2129', band = '#171922', accent = '#00d4ff', orange = '#ff6b35', mesh = true  },
    -- Stahlblaues Gehaeuse mit tiefblauem Band
    ozean       = { label = 'Ocean',      case = '#5b6b7d', band = '#1d6fd8', accent = '#00d4ff', orange = '#ff9d5c', mesh = false },
    -- Bronze mit dem Orange des Hauses
    abendrot    = { label = 'Sunset',     case = '#8f5c3a', band = '#ff6b35', accent = '#ffc24a', orange = '#ff8a4a', mesh = false },
    -- Die Hausfarben selbst
    agency      = { label = 'Agency',     case = '#2a2f3a', band = '#0f1620', accent = '#00d4ff', orange = '#ff6b35', mesh = true  },
}

-- ═══════════════════════════════════════════════════════════════
--  6  SPERRE — Zahlencode beim Oeffnen
--  Ein Rollenspiel-Element, kein Schutz gegen Mitspieler mit Werkzeugen.
-- ═══════════════════════════════════════════════════════════════
-- Die Uhr ist beim ersten Oeffnen gesperrt. Wird ein Agency Phone erkannt,
-- entsperrt sie sich von selbst und fragt nie nach dem Code.
Config.LockScreen      = true      -- Code beim Oeffnen verlangen
Config.LockCode        = '0000'    -- vierstellig
Config.LockRemember    = true      -- Code pro Sitzung nur einmal abfragen
Config.UnlockWithPhone = true      -- mit erkanntem Agency Phone ohne Code oeffnen

-- ═══════════════════════════════════════════════════════════════
--  7  ZIFFERBLAETTER — Reihenfolge ist zugleich die Blaetterreihenfolge
--     puls   = Standard: Datum, Ringe, grosse Zeit, Pulskurve, Kurzwahlen
--     raster = dichte Uebersicht mit Werten rundherum
--     digital = grosse Digitalanzeige mit Akzentflaeche
--     klar   = reduziert, nur Zeit und Datum
--     zeiger = klassische Zeiger
--     ringe  = Aktivitaetsringe
-- ═══════════════════════════════════════════════════════════════
-- Reihenfolge auf der Uhr. Das erste ist zugleich das, was beim Wischen
-- zuerst kommt - deshalb steht das Standardblatt hier vorn.
Config.Faces = { 'raster', 'puls', 'digital', 'klar', 'zeiger', 'ringe' }

-- Welche Zifferblaetter ohne Agency Phone nutzbar sind. Bewusst drei sehr
-- verschiedene: das Standardblatt mit allen Werten, ein reduziertes und ein
-- klassisches. Damit hat auch die kostenlose Uhr eine echte Wahl und wirkt
-- nicht beschnitten.
-- Wer alle sechs will und sie frei belegen moechte, braucht das Phone.
--
-- Das voreingestellte Blatt aus Config.DefaultFace MUSS hier stehen, sonst
-- startet die kostenlose Uhr auf einem gesperrten Zifferblatt.
Config.FreeFaces = { 'raster', 'klar', 'zeiger' }

-- ═══════════════════════════════════════════════════════════════
--  7b  ZIFFERBLATT FREI BELEGEN (nur mit Agency Phone)
--  Die beiden kleinen Werte links neben der Uhrzeit und die Messzeile
--  darunter lassen sich mit einem beliebigen Wert aus dieser Liste belegen.
--  Wer hier etwas ergaenzt, muss den Schluessel auch in der Oberflaeche
--  kennen (html/js/app.js, Funktion komplikation).
-- ═══════════════════════════════════════════════════════════════
-- Beschriftungen wieder auf Englisch, damit sie uebersetzt werden. Siehe
-- den Hinweis bei Config.ActionPresets.
Config.Komplikationen = {
    { id = 'leben',     label = 'Health',     icon = 'herz',      farbe = '#ff453a' },
    { id = 'panzerung', label = 'Armour',     icon = 'schild',    farbe = '#00d4ff' },
    { id = 'schritte',  label = 'Steps',      icon = 'schritte',  farbe = '#ff9f0a' },
    { id = 'strecke',   label = 'Distance',   icon = 'karte-pin', farbe = '#5e5ce6' },
    { id = 'kalorien',  label = 'Calories',   icon = 'blitz',     farbe = '#ffd60a' },
    { id = 'puls',      label = 'Heart rate', icon = 'herz',      farbe = '#ff453a' },
    { id = 'tempo',     label = 'Speed',      icon = 'tempo',     farbe = '#30d158' },
    { id = 'wetter',    label = 'Weather',    icon = 'sonne',     farbe = '#64d2ff' },
    { id = 'kompass',   label = 'Compass',    icon = 'kompass',   farbe = '#a855f7' },
    { id = 'geld',      label = 'Agency Pay', icon = 'karte',     farbe = '#ff6b35', pro = true },
    { id = 'keine',     label = 'None',       icon = 'verboten',  farbe = '#8e8e93' },
}

-- Voreinstellung der drei Felder auf dem Standardblatt
Config.FaceSlots = {
    oben  = 'leben',      -- oberer kleiner Wert links
    unten = 'schritte',   -- unterer kleiner Wert links
    zeile = 'puls',       -- die Messzeile mit Verlaufskurve
}

-- ═══════════════════════════════════════════════════════════════
--  8  APPS — Reihenfolge, Sichtbarkeit und Pro-Abhaengigkeit
-- ═══════════════════════════════════════════════════════════════
--  DIE GRENZE ZWISCHEN KOSTENLOS UND PRO
--
--  Die Regel dahinter ist bewusst einfach und fuer jeden Spieler auf
--  Anhieb einleuchtend:
--
--    Alles, was eine Uhr aus sich heraus kann, ist kostenlos.
--    Alles, was aus dem Telefon kommt, braucht das Telefon.
--
--  Deshalb ist keine einzige Grundfunktion gesperrt. Zifferblaetter,
--  Themes, Aktivitaet, Sport, Stoppuhr, Timer, Wecker, Wetter, Kompass,
--  Tacho, Mitteilungen, das Kontrollzentrum und saemtliche Einstellungen
--  laufen ohne Telefon vollstaendig. Wer die Uhr kostenlos nutzt, hat ein
--  fertiges Geraet und kein Werbegeruest.
--
--  Gesperrt ist nur, was ohne Telefon technisch gar nicht existieren
--  koennte: Anrufe, Nachrichten, Mail, Kontakte, Bezahlen und die
--  Kopplung mit der Companion-App. Diese Apps waeren ohne Agency Phone
--  keine gesperrten Apps, sondern schlicht leere.
--
--  pro = true   ->  braucht das Agency Phone
--  pro = false  ->  laeuft immer
-- ═══════════════════════════════════════════════════════════════
Config.Apps = {
    -- ── Braucht das Agency Phone ────────────────────────────────
    { id = 'telefon',     label = 'Phone',       icon = 'telefon',   color = '#34c759', enabled = true, pro = true  },
    { id = 'nachrichten', label = 'Messages',   icon = 'sprechen',  color = '#30d158', enabled = true, pro = true  },
    { id = 'mail',        label = 'Mail',          icon = 'brief',     color = '#0a84ff', enabled = true, pro = true  },
    { id = 'kontakte',    label = 'Contacts',      icon = 'personen',  color = '#34c759', enabled = true, pro = true  },
    { id = 'geld',        label = 'Agency Pay',    icon = 'karte',     color = '#ff6b35', enabled = true, pro = true  },
    -- Kostenlos: die Uhr hat einen eigenen Draht zur Companion-App und
    -- braucht das Agency Phone dafuer nicht mehr (siehe Config.Companion).
    { id = 'companion',   label = 'Companion',     icon = 'qr',        color = '#00d4ff', enabled = true, pro = false },

    -- ── Laeuft immer, auch ganz ohne Telefon ────────────────────
    -- Mitteilungen sind bewusst kostenlos: die Uhr meldet Wecker, Timer
    -- und erreichte Ziele selbst. Mit Telefon kommen dessen Meldungen
    -- zusaetzlich dazu, die App ist also nie leer.
    { id = 'meldungen',   label = 'Notifications',  icon = 'glocke',    color = '#ff9f0a', enabled = true, pro = false },
    { id = 'aktivitaet',  label = 'Activity',    icon = 'herz',      color = '#ff2d55', enabled = true, pro = false },
    { id = 'training',    label = 'Workout',      icon = 'laufen',    color = '#a3ff12', enabled = true, pro = false },
    { id = 'stoppuhr',    label = 'Stopwatch',      icon = 'stoppuhr',  color = '#ff9f0a', enabled = true, pro = false },
    { id = 'timer',       label = 'Timer',         icon = 'sanduhr',   color = '#ff9f0a', enabled = true, pro = false },
    { id = 'wecker',      label = 'Alarm',        icon = 'glocke',    color = '#ff9f0a', enabled = true, pro = false },
    { id = 'wetter',      label = 'Weather',        icon = 'sonne',     color = '#64d2ff', enabled = true, pro = false },
    { id = 'kompass',     label = 'Compass',       icon = 'kompass',   color = '#ff453a', enabled = true, pro = false },
    { id = 'karte',       label = 'Speedometer',         icon = 'karte-pin', color = '#5e5ce6', enabled = true, pro = false },
    -- Die Garage zieht ihre Daten aus dem Framework, nicht aus dem Telefon.
    -- Sie laeuft deshalb auch kostenlos. Ohne Framework blendet sie sich
    -- selbst aus, statt leer dazustehen.
    { id = 'garage',      label = 'Garage',        icon = 'auto',      color = '#0a84ff', enabled = true, pro = false },
    { id = 'zifferblatt', label = 'Watch Face',   icon = 'uhr',       color = '#ff9f0a', enabled = true, pro = false },
    { id = 'store',       label = 'App Store',     icon = 'einkauf',   color = '#0a84ff', enabled = true, pro = false },
    { id = 'einstellung', label = 'Settings', icon = 'zahnrad',   color = '#8e8e93', enabled = true, pro = false },
}

-- ═══════════════════════════════════════════════════════════════
--  8c  WETTER
--  Los Santos kommt aus dem Spiel. Alles andere sind echte Staedte, die
--  Werte holt die Uhr von open-meteo.com - kostenlos, ohne Schluessel und
--  ohne Anmeldung, genau wie das Agency Phone es tut.
--
--  Wer keine echten Staedte will, leert die Liste. Dann zeigt die App nur
--  Los Santos und der Ortswechsel verschwindet.
-- ═══════════════════════════════════════════════════════════════
Config.Wetter = {
    staedte = {
        'Berlin', 'Hamburg', 'München', 'Wien', 'Zürich',
        'London', 'Paris', 'Madrid', 'Rom', 'Amsterdam',
        'New York', 'Los Angeles', 'Miami', 'Tokio', 'Dubai',
        'Sydney', 'Reykjavik', 'Kapstadt',
    },
    -- Wie lange geholte Werte gelten, bevor neu gefragt wird (Minuten).
    frischeMinuten = 15,
}

-- ═══════════════════════════════════════════════════════════════
--  8a  APP STORE
--  Nicht alles liegt ab Werk auf der Uhr. Was fehlt, holt sich der Spieler
--  im Store, und was er nicht braucht, loescht er wieder. Beides wird pro
--  Figur gemerkt, genau wie Zifferblatt und Code.
--
--  Laenger auf eine App druecken laesst die Liste wackeln: dann kann man sie
--  umsortieren und loeschen.
-- ═══════════════════════════════════════════════════════════════
Config.AppStore = {
    enabled = true,

    -- Was ab Werk installiert ist. Der Rest steht im Store bereit.
    -- Diese Liste leer lassen heisst: alles ist von Anfang an da.
    vorinstalliert = {
        'telefon', 'nachrichten', 'geld', 'companion', 'meldungen', 'aktivitaet',
        'wetter', 'stoppuhr', 'zifferblatt', 'store', 'einstellung',
    },

    -- Diese lassen sich nie loeschen. Ohne Einstellungen und Store kaeme man
    -- an nichts mehr heran, und ohne Zifferblatt-App an kein anderes Blatt.
    fest = { 'einstellung', 'store', 'zifferblatt' },

    -- Wie lange das Laden im Store dauert (Sekunden). 0 = sofort da.
    ladedauer = 2.0,
}

-- ═══════════════════════════════════════════════════════════════
--  8b  GARAGE
--  Fahrzeuge ansehen, orten und rufen. Die Liste kommt aus der Datenbank
--  des Frameworks (QBCore: player_vehicles, ESX: owned_vehicles). Ohne
--  Framework gibt es keine Fahrzeugbesitzer, dann verschwindet die App.
-- ═══════════════════════════════════════════════════════════════
Config.Garage = {
    enabled = true,

    -- Darf die Uhr Fahrzeuge herbeirufen?
    -- false = die App zeigt nur an und ortet.
    rufen = true,

    -- Das Herbeirufen ist die Fernsteuerung des Fahrzeugs und damit die
    -- Pro-Funktion dieser App. Ansehen, orten und abschliessen bleiben immer
    -- kostenlos, die App ist ohne Telefon also nie leer.
    -- Auf false gesetzt darf jeder rufen.
    rufenNurPro = true,

    -- Sekunden zwischen zwei Rufen, pro Spieler.
    abklingzeit = 45,

    -- Kosten pro Ruf. 0 = kostenlos.
    -- konto: 'bank' | 'cash'
    kosten = 0,
    konto  = 'bank',

    -- Nur Fahrzeuge zeigen, die wirklich eingelagert sind. Ein Fahrzeug,
    -- das schon auf der Strasse steht, laesst sich nicht noch einmal rufen.
    nurEingelagerte = true,

    -- Darf ein bereits ausgeparktes Fahrzeug aus der Ferne geortet werden?
    orten = true,

    -- Tueren aus der Naehe auf- und zuschliessen (Meter).
    schliessweite = 15.0,

    -- Auf welche Fahrzeugtabelle wird gelesen. 'auto' waehlt nach Framework.
    tabelle = 'auto',   -- 'auto' | 'player_vehicles' | 'owned_vehicles'
}

-- Tagesziel fuer Schritte. Steuert die Ringe und die Meldung beim
-- Erreichen. Rein kostenlos, braucht kein Telefon.
Config.Schrittziel = 8000

-- Zu welcher Stunde beginnt der neue Tag? Dann werden Schritte, Strecke,
-- aktive Zeit und Verbrauch auf null gesetzt und der alte Tag wandert in den
-- Verlauf. Massgeblich ist die Spielzeit, nicht die echte.
--
-- 0 = Mitternacht. Wer den Zaehler nicht mitten in der Nacht verlieren will,
-- traegt hier z. B. 4 ein - dann gehoeren 0 bis 3 Uhr noch zum Vortag.
--
-- Ein Neustart des Scripts setzt NICHTS zurueck. Nur der Tageswechsel tut das.
Config.SchritteReset = 0

-- ═══════════════════════════════════════════════════════════════
--  KONTROLLZENTRUM
--  Jede Kachel bewirkt wirklich etwas und wird gemerkt. Eine Akkuanzeige gab
--  es hier einmal - sie ist entfallen, weil es im Spiel nichts zu laden gibt
--  und die Zahl damit reine Zierde war.
--
--  Reihenfolge und Auswahl stehen in 'kacheln'. Was hier nicht steht, taucht
--  auch nicht auf; wer die Reihenfolge aendert, aendert sie auf der Uhr.
--
--  Verfuegbar:
--    mobilfunk  Verbindung zum Telefon. Aus = keine Anrufe, keine Mitteilungen
--    wlan       Netz. Aus = keine Kopplung, kein Wetter
--    flugmodus  schaltet Mobilfunk und WLAN gemeinsam ab
--    lautlos    Toene der Uhr aus
--    kino       die Uhr meldet sich gar nicht mehr
--    lampe      Taschenlampe (siehe Config.Lampe)
--    licht      helles oder dunkles Aussehen
--    wecker     oeffnet den Wecker
--    wegpunkt   loescht den gesetzten Wegpunkt
--    sperren    sperrt die Uhr sofort (nur mit gesetztem Code)
--    pay        oeffnet Agency Pay      (nur mit Agency Phone)
--    garage     oeffnet die Garage
-- ═══════════════════════════════════════════════════════════════
Config.ControlCenter = {
    kacheln = {
        'mobilfunk', 'wlan',
        'flugmodus', 'lampe',
        'lautlos',   'kino',
        'licht',     'wecker',
        'wegpunkt',  'sperren',
        'pay',       'garage',
    },
    -- Helligkeitsregler unter den Kacheln
    hell = true,
}

-- ═══════════════════════════════════════════════════════════════
--  9  AGENCY PHONE
-- ═══════════════════════════════════════════════════════════════
Config.EnablePhone   = true
Config.PhoneResource = 'agency-phone'

-- Wohin der Knopf in einer gesperrten App fuehrt. Direkt zum Agency Phone,
-- nicht auf die Startseite: wer dort landet, sucht genau dieses Produkt.
Config.ShopUrl = 'https://shop.agencyg.de/en/product/phone'

-- ═══════════════════════════════════════════════════════════════
--  9b  AGENCY COMPANION (Handy-App)
--  Die Uhr kann sich selbst mit der Companion-App koppeln, ganz ohne
--  Agency Phone. Sie meldet sich dafuer beim Relay an und haelt die
--  Verbindung von sich aus offen - der Server waehlt nur nach draussen,
--  es muss also kein Port geoeffnet werden.
--
--  kanal:
--    'auto'  laeuft ein Agency Phone, geht die Kopplung ueber dessen
--            Verbindung (ein Weg nach draussen statt zwei). Ohne Telefon
--            macht die Uhr es selbst.
--    'immer' die Uhr hat immer ihren eigenen Kanal
--    'nie'   nur ueber das Telefon; ohne Telefon gibt es keine Kopplung
-- ═══════════════════════════════════════════════════════════════
Config.Companion = {
    enabled = true,
    -- 'immer' ab Werk: die Uhr ist ein eigenstaendiges Geraet und soll auch
    -- in der App als eigenes erscheinen, nicht als Anhaengsel des Telefons.
    -- Wer nur eine Verbindung nach draussen will, stellt auf 'auto'.
    kanal   = 'immer',
    relay   = 'https://api.agencyg.de',
    -- Wie lange ein Kopplungscode gilt (Sekunden).
    codeDauer = 600,
    -- Wie viele Geraete ein Spieler gleichzeitig gekoppelt haben darf.
    maxGeraete = 5,
}

-- ═══════════════════════════════════════════════════════════════
--  STURZERKENNUNG UND NOTRUF
--  Die Uhr merkt selbst, wenn etwas passiert ist, kommt von allein hervor
--  und bietet den Notruf an. Das laeuft auch ganz ohne Agency Phone - eine
--  Uhr, die im Notfall nichts kann, waere genau dann nutzlos, wenn sie
--  gebraucht wird.
-- ═══════════════════════════════════════════════════════════════
Config.Sturz = {
    enabled = true,

    -- Ab wie viel Schaden auf einen Schlag gilt es als Notfall.
    -- Der Wert ist bewusst hoch: ein Faustschlag oder ein Sturz von der
    -- Bordsteinkante soll die Uhr nicht aufwecken.
    schaden = 35,

    -- Aufprall im Fahrzeug: Tempoverlust in km/h innerhalb eines Taktes.
    -- Zusaetzlich muss Schaden entstanden sein, sonst waere jedes scharfe
    -- Bremsen ein Unfall.
    tempoverlust = 45,

    -- Sturz aus der Hoehe: Schaden waehrend des Fallens.
    sturzschaden = 20,

    -- Sekunden, die der Bildschirm von selbst stehen bleibt.
    dauer = 45,

    -- Sekunden Ruhe zwischen zwei Meldungen. Ohne das meldet sich die Uhr
    -- bei einer Schlaegerei im Sekundentakt.
    abstand = 30,

    -- Wohin der Notruf geht, wenn KEIN Agency Phone vorhanden ist.
    -- Leer lassen, wenn der Server keinen eigenen Weg hat - die Uhr sagt
    -- dann ehrlich, dass sie niemanden erreichen konnte.
    -- Beide bekommen: { quelle, art, coords, street }
    notrufEvent   = '',   -- z. B. 'mein-dispatch:server:notruf'
    notfallEvent  = '',   -- Notfallkontakt statt Rettungsdienst
}

-- ═══════════════════════════════════════════════════════════════
--  Bezahlstellen von Agency Pay
--  Die Uhr uebernimmt die Stellen des Agency Phone automatisch. Hier
--  eingetragene kommen dazu - und werden umgekehrt auch beim Telefon
--  angemeldet, sodass beide Geraete dieselben kennen.
--  Ohne Telefon funktionieren diese Stellen trotzdem.
-- ═══════════════════════════════════════════════════════════════
-- Ab Werk leer. Die Stellen des Agency Phone werden ohnehin uebernommen,
-- eine mitgelieferte Stelle waere auf jedem fremden Server ein Punkt, den
-- dort niemand bestellt hat. Eigene Stellen nach diesem Muster eintragen:
--
--   { id = 'meine_stelle', coords = vector3(25.7, -1347.3, 29.5),
--     merchant = '24/7 Strawberry', label = 'Agency Pay', radius = 3.0 },
--
Config.PayPunkte = {}

-- Sollen die eigenen Stellen auch auf der Karte auftauchen?
-- Aus, solange oben nichts steht. Wer eigene Stellen eintraegt und sie
-- auffindbar machen will, setzt das auf true.
Config.PayPunkteBlip = false

-- Welche App auf dem Telefon eine App der Uhr fortsetzt.
-- Auf der Uhr laesst sich lesen, aber nicht schreiben. Tippt man dort eine
-- Nachricht an, holt die Uhr das Telefon hervor, entsperrt es und springt in
-- die passende App. Heisst eine App auf dem Telefon anders, hier eintragen.
Config.PhoneApps = {
    nachrichten = 'buzz',
    mail        = 'postbox',
    kontakte    = 'contacts',
    telefon     = 'dialer',
    geld        = 'wallet',
}

-- Eigenes Symbol der Uhr auf dem Startbildschirm des Phones.
-- Auf false setzen, wenn die vollstaendige Watch-App des Phones genutzt wird,
-- damit nicht zwei Eintraege nebeneinander stehen.
Config.RegisterPhoneApp = false

-- ═══════════════════════════════════════════════════════════════
--  9b  PRO-PRUEFUNG
--  Hier steht KEIN Geheimnis. Das gemeinsame Geheimnis liegt ausschliesslich
--  in der verschluesselten server/security.lua. Die Pro-Fassung wird immer
--  auf dem Server entschieden und dem Client nur mitgeteilt.
-- ═══════════════════════════════════════════════════════════════
Config.Security = {
    -- Sekunden zwischen den regelmaessigen Nachpruefungen
    RecheckSeconds = 300,

    -- Erlaubte Zeitabweichung in Sekunden beim Handschlag
    HandshakeSkew  = 30,

    -- NOTWEG, ab Werk AUS.
    -- Der vorgesehene und sichere Weg ist der Handschlag mit dem echten
    -- Agency Phone. Er ist ab Phone-Fassung 26.5.4 eingebaut und braucht
    -- keinerlei Einrichtung.
    --
    -- Diesen Schalter nur einschalten, wenn das Agency Phone aelter ist und
    -- sich nicht sofort aktualisieren laesst. Dann gilt: Pro bekommt, wer den
    -- unten genannten Gegenstand besitzt UND dessen Phone echt wirkt. Das ist
    -- schwaecher als der Handschlag.
    --
    -- Achtung bei der Wahl des Gegenstands: 'phone' ist in QBCore ein
    -- Standardgegenstand, den fast jeder Spieler von Beginn an hat. Wer ihn
    -- hier eintraegt, verschenkt die Pro-Fassung an alle.
    AllowItemFallback = false,
    PhoneItem         = 'agency_phone',
}

-- ═══════════════════════════════════════════════════════════════
--  10  EIGENE TEXTE
--  Alle Uebersetzungen stehen in shared/sprachen.lua, zehn Sprachen,
--  dieselben wie im Agency Phone. Hier gehoeren nur eigene Aenderungen
--  hin. Was hier steht, gilt VOR der mitgelieferten Uebersetzung und
--  ueberlebt jede Aktualisierung des Scripts.
--
--  Beispiel:
--    Config.Text = {
--        de = { apps = 'Programme', p_senden = 'Abschicken' },
--        en = { apps = 'Programs' },
--    }
-- ═══════════════════════════════════════════════════════════════
Config.Text = {}

-- Beschriftung nachschlagen. Reihenfolge: eigener Text, gewaehlte Sprache,
-- Englisch als Rueckfall. Der rohe Schluessel erscheint nie.
function T(schluessel)
    local code = Config.Locale or 'en'
    local eigen = Config.Text[code]
    if eigen and eigen[schluessel] then return eigen[schluessel] end
    local sprache = Sprachen[code]
    if sprache and sprache[schluessel] then return sprache[schluessel] end
    return Sprachen.en[schluessel] or ''
end