using System;
using System.IO;
using System.Collections.Generic;
using NLog;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using DataClient.Struct;
using System.Net;
using System.Threading.Tasks;
namespace DataClient
{
/// Класс для связи с СТП. Содержит все инструменты, для получения данных.
public class STPClient
{
//ЛОГИРОВАНИЕ
private Logger log = LogManager.GetCurrentClassLogger();
//КОНФИГУРАЦИЯ
private string confDir = Path.Combine(Directory.GetCurrentDirectory(), "Config");
private Dictionary confAnalog = new Dictionary();
private List<(int num, string name)> vdpList = new List<(int num, string name)>();
/// Чтение конфигурационнного файла и установка параметров по умолчанию.
private void Config()
{
string jsonString;
var confFile = Path.Combine(confDir, "config.json");
try
{
jsonString = File.ReadAllText(confFile);
}
catch (Exception e)
{
log.Warn(e, "Can't read config file from " + confDir + ".");
return;
}
var conf = (JObject)JsonConvert.DeserializeObject(jsonString);
if (!conf.HasValues && !conf["servers"].HasValues && conf["servers"].Type != JTokenType.Array)
{
log.Warn("Doesn't exist \"servers\" object in config file.");
return;
}
var count = -1;
foreach (var s in conf["servers"])
{
count++;
var name = (s["name"].Type == JTokenType.String) ? (string)s["name"] : "default";
var ip = (s["ip"].Type == JTokenType.String) ? (string)s["ip"] : "";
var port = (s["port"].Type == JTokenType.Integer) ? (int)s["port"] : -1;
var dir = (s["dir"].Type == JTokenType.String) ? (string)s["dir"] : "";
var res = false;
var idx = _servers.FindIndex(x => x.name == name);
if (idx == -1)
res = AddServer(name, ip, port, dir);
else
{
_servers.RemoveAt(idx);
res = AddServer(name, ip, port, dir);
}
if (!res)
log.Trace("Can't add or change server #" + count + " from conf file.");
}
//init vdp
for (var i = 0; i < 49; i++)
vdpList.Add(new(i, i == 0 ? "Общие" : "Печь " + i.ToString("D2")));
for (var i = 91; i < 95; i++)
vdpList.Add((i, "Печь " + i.ToString("D2")));
//init analog
var tmpvdp = new List();
foreach (var v in vdpList) tmpvdp.Add(v.num);
confAnalog = Configuration.InitAnalogList(Path.Combine(confDir, "analog"), tmpvdp.ToArray());
}
//РАБОТА С СЕРВЕРОМ
private List _servers = new List();
private int _useServer = -1;
/// Номер сервера, используемого по умолчанию.
public int UseServer
{
get { return _useServer; }
set
{
_useServer =
(_servers.Count == 0) ? -1 :
(value < 0) ? 0 :
(value >= _servers.Count) ? _useServer = _servers.Count - 1 :
value;
}
}
/// Массив серверов, инициализированных в экземпляре класса.
public server[] ListServers
{
get { return _servers.ToArray(); }
}
/// Текущий рабочий сервер
public server? Server
{
get { return (_useServer == -1) ? null : _servers[_useServer]; }
}
///
/// Проверка параметров сервера.
///
/// Ip адрес сервера СТП.
/// Порт сервера СТП.
/// Путь к архивным данным.
/// Результат проверки.
private bool CheckDataServer(string ip, int port, string dir)
{
if (!IPAddress.TryParse(ip, out _))
{
log.Warn("Ip address incorrect: " + ip + " .");
return false;
}
if (port < 1 && port > 65535)
{
log.Warn("Port incorrect: " + port.ToString() + ".");
return false;
}
if (!Directory.Exists(dir))
{
log.Warn("Directory incorrect or not exist: " + dir + " .");
return false;
}
return true;
}
/// Добавление сервера в список серверов.
/// Название сервера
/// IP адресс сервера.
/// Порт сервера.
/// Путь к архиву.
/// Результат выполнения функции.
public bool AddServer(string name, string ip, int port, string dir)
{
if (!CheckDataServer(ip, port, dir))
{
log.Warn("Server not added: Data incorrect.");
return false;
}
if (string.IsNullOrEmpty(name))
{
log.Warn("Server not added: Incorrect name server.");
return false;
}
if (_servers.FindIndex(x => x.name == name) != -1)
{
log.Warn("Server not added: Server with this name exist.");
return false;
}
_servers.Add(new server(name, ip, port, dir));
_useServer = 0;
log.Trace("Server (name=" + name + ";ip=" + ip + ";port=" + port + ";dir=" + dir + ") added.");
return true;
}
/// Удаление сервера из списка серверов по его номеру.
/// Номер сервера в списке серверов.
/// Результат выполнения функции.
public bool RemoveServer(int id)
{
if (_servers.Count == 0 || id >= _servers.Count || id < 0)
{
log.Warn("Server not removed: Id incorrect or list server are empty.");
return false;
}
log.Trace("Server id=" + id.ToString() + ";name=" + _servers[id].name + ";ip=" + _servers[id].ip + ";port=" + _servers[id].port.ToString() + ";dir=" + _servers[id].dir + "; removed.");
_servers.RemoveAt(id);
UseServer = 0;
return true;
}
//#################
//Переменные
//Геттеры и сеттеры
//Функции
/// Создание экземпляра класса.
public STPClient()
{
log.Trace("Create instance class.");
Config();
}
/// Создание экземпляра класса с указанием конфигурационного файла.
/// Путь к файлу конфигурации.
public STPClient(string confDir)
{
log.Trace("Create instance class with dir:" + confDir + ".");
this.confDir = confDir;
Config();
}
public TechCycle[] GetTechCyclesList(int vdp, DateTime tS, DateTime tE)
{
//Use File with ID = 3
var res = new List();
return res.ToArray();
}
public (ConfAnalog conf, Analog[] list)[] GetAnalogsList(int vdp, DateTime tS, DateTime tE, int[] idA = null)
{
return Array.Empty<(ConfAnalog conf, Analog[] list)>();
}
}
}