using Admin.NET.Core.Service;

namespace WCS.Application;

/// <summary>
/// PLC服务
/// </summary>
[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
public class WcsPlcService : IDynamicApiController, ITransient
{
    private readonly SqlSugarRepository<WcsPlc> _wcsPlcRep;
    private readonly SysCacheService _sysCacheService;
    public WcsPlcService(SqlSugarRepository<WcsPlc> wcsPlcRep, SysCacheService sysCacheService)
    {
        _wcsPlcRep = wcsPlcRep;
        _sysCacheService = sysCacheService;
    }

    /// <summary>
    /// 分页查询PLC
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Page")]
    [DisplayName("分页查询PLC")]
    public async Task<SqlSugarPagedList<WcsPlcOutput>> Page(PageWcsPlcInput input)
    {
        input.SearchKey = input.SearchKey?.Trim();
        var query = _wcsPlcRep.AsQueryable()
            .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u =>
                u.IP.Contains(input.SearchKey) && u.Text.Contains(input.SearchKey)
            )
            .WhereIF(input.PLCType.HasValue, u => u.PLCType == input.PLCType)
            .WhereIF(!string.IsNullOrWhiteSpace(input.IP), u => u.IP.Contains(input.IP.Trim()))
            .WhereIF(input.Type.HasValue, u => u.Type == input.Type)
            .WhereIF(input.Enable.HasValue, u => u.Enable == input.Enable)
            .Select<WcsPlcOutput>();
        return await query.OrderBuilder(input,input.Type.ToString()).ToPagedListAsync(input.Page, input.PageSize);
    }

    /// <summary>
    /// 增加PLC
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Add")]
    [DisplayName("增加PLC")]
    public async Task<long> Add(AddWcsPlcInput input)
    {
        var entity = input.Adapt<WcsPlc>();
        await _wcsPlcRep.InsertAsync(entity);
        return entity.Id;
    }

    /// <summary>
    /// 删除PLC
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Delete")]
    [DisplayName("删除PLC")]
    public async Task Delete(DeleteWcsPlcInput input)
    {
        var entity = await _wcsPlcRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
        await _wcsPlcRep.FakeDeleteAsync(entity);   //假删除
        //await _wcsPlcRep.DeleteAsync(entity);   //真删除
    }

    /// <summary>
    /// æ›´æ–°PLC
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Update")]
    [DisplayName("æ›´æ–°PLC")]
    public async Task Update(UpdateWcsPlcInput input)
    {
        var entity = input.Adapt<WcsPlc>();
        await _wcsPlcRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
    }

    /// <summary>
    /// 获取PLC
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "Detail")]
    [DisplayName("获取PLC")]
    public async Task<WcsPlc> Detail([FromQuery] QueryByIdWcsPlcInput input)
    {
        return await _wcsPlcRep.GetFirstAsync(u => u.Id == input.Id);
    }

    /// <summary>
    /// 获取PLC列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "List")]
    [DisplayName("获取PLC列表")]
    public async Task<List<WcsPlcOutput>> List([FromQuery] PageWcsPlcInput input)
    {
        return await _wcsPlcRep.AsQueryable().WhereIF(input.Type != null, s => s.Type == input.Type).Select<WcsPlcOutput>().ToListAsync();
    }

    /// <summary>
    /// 获取PLC连接状态和服务状态
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "ListStatus")]
    [DisplayName("获取PLC连接状态")]
    public async Task<dynamic> ListStatus([FromQuery] PageWcsPlcInput input)
    {
        var listPlc = await _wcsPlcRep.AsQueryable()
            .Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine || s.Type == PLCTypeEnum.BoxConveyorLine)
            .ToListAsync();
        foreach (var modPlc in listPlc)
        {
            if (_sysCacheService.ExistKey("PLCCONN:" + modPlc.Id))
            {
                var cachePlc = _sysCacheService.Get<WcsPlc>("PLCCONN:" + modPlc.Id);
                modPlc.IsConn = cachePlc.IsConn;
            }
            else
            {
                modPlc.IsConn = false;
            }
        }
        //服务状态
        var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal, PLCTaskAction.boOutLock, PLCTaskAction.boEnterLock };
        return new { listPlc, modService };
    }
    /// <summary>
    /// 获取位置信息
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "ListPosition")]
    [DisplayName("获取位置信息")]
    public List<PlcPositionInfo> ListPosition()
    {
        var list = PLCTaskAction.listPositionInfo.ToList();
        return list;
    }
}