// AUTHORED SHIM (not copied). Input / Random / Resources statics + the full KeyCode
// enum. Referenced almost entirely by non-battle UI/input files swept into the closure;
// headless we never pump input and never load resources, so all of this is inert.
using System;

namespace UnityEngine
{
    public static partial class Input
    {
        public static Vector3 mousePosition => Vector3.zero;
        public static Vector2 mouseScrollDelta => Vector2.zero;
        public static int touchCount => 0;
        public static Touch[] touches => new Touch[0];
        public static Touch GetTouch(int i) => default;
        public static bool anyKey => false;
        public static bool anyKeyDown => false;
        public static bool mousePresent => false;
        public static bool GetMouseButton(int b) => false;
        public static bool GetMouseButtonDown(int b) => false;
        public static bool GetMouseButtonUp(int b) => false;
        public static bool GetKey(KeyCode k) => false;
        public static bool GetKey(string n) => false;
        public static bool GetKeyDown(KeyCode k) => false;
        public static bool GetKeyDown(string n) => false;
        public static bool GetKeyUp(KeyCode k) => false;
        public static bool GetButton(string n) => false;
        public static bool GetButtonDown(string n) => false;
        public static float GetAxis(string n) => 0f;
        public static float GetAxisRaw(string n) => 0f;
        public static string inputString => "";
        public static bool multiTouchEnabled { get; set; }
    }

    public static class Random
    {
        public static float value => 0f;
        public static int Range(int minInclusive, int maxExclusive) => minInclusive;
        public static float Range(float min, float max) => min;
        public static Vector2 insideUnitCircle => Vector2.zero;
        public static Vector3 insideUnitSphere => Vector3.zero;
        public static Vector3 onUnitSphere => Vector3.up;
        public static Quaternion rotation => Quaternion.identity;
        public static Quaternion rotationUniform => Quaternion.identity;
        public static int seed { get; set; }
        public static void InitState(int s) { }
        public static Color ColorHSV() => Color.white;
    }

    public static partial class Resources
    {
        public static T Load<T>(string path) where T : Object => null;
        public static T Load<T>(string path, Type t) where T : Object => null;
        // Headless: the non-generic Load is used by the copied PrefabMgr to back a prefab
        // dictionary that the resolution-path ctor then Instantiate()s + GetComponent()s
        // (e.g. Prefab/Game/UnityEventAgent). Return a cached no-op GameObject per path so that
        // chain yields a non-null object. Typed asset loads go through the generic Load<T> (null).
        // ConcurrentDictionary + GetOrAdd so concurrent battle setups don't race on first-miss.
        private static readonly System.Collections.Concurrent.ConcurrentDictionary<string, GameObject> _loaded
            = new System.Collections.Concurrent.ConcurrentDictionary<string, GameObject>();
        public static Object Load(string path)
        {
            if (string.IsNullOrEmpty(path)) return null;
            return _loaded.GetOrAdd(path, static p => new GameObject(p));
        }
        public static Object Load(string path, Type t) => Load(path);
        public static T[] LoadAll<T>(string path) where T : Object => new T[0];
        public static Object[] LoadAll(string path) => new Object[0];
        public static ResourceRequest LoadAsync<T>(string path) where T : Object => null;
        public static ResourceRequest LoadAsync(string path) => null;
        public static void UnloadAsset(Object o) { }
        public static AsyncOperation UnloadUnusedAssets() => null;
    }

    public class ResourceRequest : AsyncOperation { public Object asset => null; }

    public enum KeyCode
    {
        None = 0,
        Backspace = 8, Tab = 9, Clear = 12, Return = 13, Pause = 19, Escape = 27, Space = 32,
        Exclaim = 33, DoubleQuote = 34, Hash = 35, Dollar = 36, Ampersand = 38, Quote = 39,
        LeftParen = 40, RightParen = 41, Asterisk = 42, Plus = 43, Comma = 44, Minus = 45,
        Period = 46, Slash = 47,
        Alpha0 = 48, Alpha1, Alpha2, Alpha3, Alpha4, Alpha5, Alpha6, Alpha7, Alpha8, Alpha9,
        Colon = 58, Semicolon = 59, Less = 60, Equals = 61, Greater = 62, Question = 63, At = 64,
        LeftBracket = 91, Backslash = 92, RightBracket = 93, Caret = 94, Underscore = 95, BackQuote = 96,
        A = 97, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
        LeftCurlyBracket = 123, Pipe = 124, RightCurlyBracket = 125, Tilde = 126, Delete = 127,
        Keypad0 = 256, Keypad1, Keypad2, Keypad3, Keypad4, Keypad5, Keypad6, Keypad7, Keypad8, Keypad9,
        KeypadPeriod = 266, KeypadDivide = 267, KeypadMultiply = 268, KeypadMinus = 269,
        KeypadPlus = 270, KeypadEnter = 271, KeypadEquals = 272,
        UpArrow = 273, DownArrow = 274, RightArrow = 275, LeftArrow = 276,
        Insert = 277, Home = 278, End = 279, PageUp = 280, PageDown = 281,
        F1 = 282, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15,
        Numlock = 300, CapsLock = 301, ScrollLock = 302,
        RightShift = 303, LeftShift = 304, RightControl = 305, LeftControl = 306,
        RightAlt = 307, LeftAlt = 308, RightCommand = 309, LeftCommand = 310,
        LeftWindows = 311, RightWindows = 312, AltGr = 313,
        Help = 315, Print = 316, SysReq = 317, Break = 318, Menu = 319,
        Mouse0 = 323, Mouse1, Mouse2, Mouse3, Mouse4, Mouse5, Mouse6,
        JoystickButton0 = 330, JoystickButton1, JoystickButton2, JoystickButton3,
        JoystickButton4, JoystickButton5, JoystickButton6, JoystickButton7,
        JoystickButton8, JoystickButton9, JoystickButton10, JoystickButton11,
        JoystickButton12, JoystickButton13, JoystickButton14, JoystickButton15,
        JoystickButton16, JoystickButton17, JoystickButton18, JoystickButton19
    }
}
