using System.Net.NetworkInformation;

namespace WCS.Core;

public class PLC : EntityEx<PLCInfo>
{
    public PLC(PLCInfo ent, World world) : base(ent)
    {
        if (Configs.PLCAccessorCreater != null)
            Accessor = Configs.PLCAccessorCreater.Create(ent);
        else
            throw new Exception("Configs.PLCAccessorCreater未赋值");

        Task.Run(() =>
        {
            while (true)
            {
                Ping = ping();
                Task.Delay(1000).Wait();
            }
            // ReSharper disable once FunctionNeverReturns
        });
    }

    public bool Ping { get; private set; }

    public IPLCAccessor Accessor { get; private set; }

    private bool ping(int timeout = 300)
    {
        var p = new Ping();
        if (Entity.IP == "1") return false;
        var res = p.Send(Entity.IP, timeout);
        return res.Status == IPStatus.Success;
    }
}

public interface IPLCAccessorCreater
{
    IPLCAccessor Create(PLCInfo data);
}

public interface IPLCAccessor
{
    void WriteBytes(ushort db, ushort address, byte[] data);

    byte[] ReadBytes(ushort db, ushort address, ushort length);
}