using Microsoft.AspNetCore.Mvc;
using Repository.BackendRepository.Interface;
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
//using Backend.Models;
using Microsoft.Extensions.Logging;
using Backend.Services;
using Backend.Services.Implement;
using Repository.Models;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using NPOI.SS.Formula.Functions;

namespace Backend.Controllers
{
    public class NiagaraDataSynchronizeController : MybaseController<NiagaraDataSynchronizeController>
    {
        private readonly IBackendRepository backendRepository;
        //private readonly IDeviceImportRepository deviceImportRepository;
        private readonly INiagaraDataSynchronizeRepository niagaraDataSynchronizeRepository;
        public NiagaraDataSynchronizeController(IBackendRepository backendRepository, INiagaraDataSynchronizeRepository niagaraDataSynchronizeRepository)
        {
            this.backendRepository = backendRepository;
            //this.deviceImportRepository = deviceImportRepository;
            this.niagaraDataSynchronizeRepository = niagaraDataSynchronizeRepository;
        }

        public IActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// N4匯入列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public Task<ApiResult<List<Device_value>>> RawDataList()
        {
            ApiResult<List<Device_value>> apiResult = new ApiResult<List<Device_value>>();

            try
            {
                List<Device_value> ds;
                string url_slot = "slot:/TPE/B1|";//三菱
                //string url_slot = "slot:/NTPC/B1|";//wsp

                string top100 = "";//" top 100 ";
                webRequestService svc = new webRequestService();
                string bql = url_slot + "bql:select " + top100 + " * from baja:Folder ";
                //ds = svc.obixQuery("http://192.168.0.136:8080/obix/config/Arena/Program/ObixQuery/query/", bql);
                //ds = svc.obixQuery("http://localhost:8080/obix/config/Program/ObixQuery/query/", bql);
                ds = svc.obixQuery("http://192.168.0.136:8080/obix/config/Program/ObixQuery/query/", bql);//三菱
                //ds = svc.obixQuery("http://192.168.0.136:8081/obix/config/Program/ObixQuery/query/", bql);//wsp

                apiResult.Code = "0000";
                apiResult.Data = ds;
            }
            catch (Exception exception)
            {
                apiResult.Code = "9999";
                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
            }

            //return apiResult;
            return Task.FromResult(apiResult);
        }

        /// <summary>
        /// 比對N4與資料表,有差異在同步至資料表中
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<ApiResult<bool>> CompareData([FromBody] List<Device_value> ds)
        {
            bool result = false;

            ApiResult<bool> apiResult = new ApiResult<bool>();
            try
            {
                var building = ds.FirstOrDefault().building;
                await niagaraDataSynchronizeRepository.InsertNiagaraTagList(ds, building);
                await niagaraDataSynchronizeRepository.DeviceComparison();
                await niagaraDataSynchronizeRepository.InsertBuildingMenu();
                await niagaraDataSynchronizeRepository.InsertSubSystemFloor();
                result = true;

                apiResult.Code = "0000";
                apiResult.Data = result;
            }
            catch (Exception exception)
            {
                apiResult.Code = "9999";
                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
            }

            return apiResult;
        }

        /// <summary>
        /// N4匯入列表(device_item)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public Task<ApiResult<List<ImpNiaItem>>> RawDataDevItemList()
        {
            ApiResult<List<ImpNiaItem>> apiResult = new ApiResult<List<ImpNiaItem>>();

            try
            {
                List<ImpNiaItem> ds;
                string url_slot = "slot:/TPE/B1|";//三菱
                //string url_slot = "slot:/NTPC/B1|";//wsp

                webRequestService svc = new webRequestService();
                ds = svc.obixHisQuery("http://192.168.0.136:8080/obix/config/Program/ObixQuery/query/", "http://192.168.0.136:8080/obix/histories", url_slot);//三菱
                //ds = svc.obixHisQuery("http://192.168.0.136:8081/obix/config/Program/ObixQuery/query/", "http://192.168.0.136:8081/obix/histories", url_slot);//wsp

                apiResult.Code = "0000";
                apiResult.Data = ds;
            }
            catch (Exception exception)
            {
                apiResult.Code = "9999";
                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
            }

            //return apiResult;
            return Task.FromResult(apiResult);
        }

        /// <summary>
        /// 比對N4與資料表,有差異在同步至資料表中(device_item)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<ApiResult<bool>> DevIteComData([FromBody] List<ImpNiaItem> ds)
        {
            bool result = false;

            ApiResult<bool> apiResult = new ApiResult<bool>();
            try
            {
                var building = ds.FirstOrDefault().device_building_tag;
                await niagaraDataSynchronizeRepository.InsertItemFromNiagara(ds, building);
                await niagaraDataSynchronizeRepository.DeviceItemComparison();
                result = true;

                apiResult.Code = "0000";
                apiResult.Data = result;
            }
            catch (Exception exception)
            {
                apiResult.Code = "9999";
                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
            }

            return apiResult;
        }
    }
}