using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Beam.Abstractions;

namespace Beam.Dynamic {
    public class StateChangerFactory : IStateChangerFactory {
        [JsonIgnore]
        public IStateChangeBehaviour Behavior => FactoryTable[StateChangerKey]();
        
        [JsonInclude]
        public string StateChangerKey { get; set; }

        [JsonConstructor]
        public StateChangerFactory(string stateChangerKey) {
            if (!Keys.Contains(stateChangerKey))
                throw new ArgumentException($"{stateChangerKey} not in keys list", nameof(stateChangerKey));
            StateChangerKey = stateChangerKey;
        }

        public static Dictionary<string, Func<IStateChangeBehaviour>> FactoryTable = new() {
            { LastAsNumber, () => CommonStateChangers.LastAsNumber },
            { LastAsNumberPrefixed, () => CommonStateChangers.NthAsNumber(^1, true) },
            { Constant, () => CommonStateChangers.Constant },
        };

        public HashSet<string> Keys = [LastAsNumber, LastAsNumberPrefixed, Constant];
        public const string LastAsNumber = "LastAsNumber";
        public const string LastAsNumberPrefixed = "LastAsNumberPrefixed";
        public const string Constant = "Constant";
    }
}
