using langguanApi.Common.Redis;
using langguanApi.Common;
using langguanApi.Extensions.AutoDI;
using langguanApi.Model;
using System.Linq.Expressions;
using langguanApi.Common.Proxy;
using langguanApi.Model.Dto;
using Npoi.Mapper;
namespace langguanApi.Service
{
    /// 
    /// HomeService
    /// 
    [ServiceInjection(InjectionType.Singleton)]
    public class HomeService
    {
        private DeviceService _deviceService;
        private Hj212Service _hj212Service;
        private readonly IConfiguration _configuration;
        private CacheManager _cacheManager;
        private readonly WeatherService _weatherService;
        private readonly AlertService _alertService;
        private readonly DetectionService _detectionService;
        private HttpProxy _httpProxy;
        /// 
        /// HomeService
        /// 
        /// 
        /// 
        public HomeService(DeviceService device, Hj212Service hj212Service,
            IConfiguration configuration, CacheManager cacheManager,
            WeatherService weatherService, AlertService alertService,
            DetectionService detectionService, HttpProxy httpProxy)
        {
            _deviceService = device;
            _hj212Service = hj212Service;
            _configuration = configuration;
            _cacheManager = cacheManager;
            _weatherService = weatherService;
            _alertService = alertService;
            _detectionService = detectionService;
            _httpProxy = httpProxy;
        }
        /// 
        /// view
        /// 
        /// 
        public async Task View()
        {
            Expression> exp = x => x.IsDelete == false && x.lng > 0 && x.lat > 0;
            var devices = (await _deviceService.GetListWithExp(exp)).ToList();
            var cleanData = new
            {
                Yesterday = 0.8,
                LastWeek = 0.6,
            };
            // 首页热力图
            var hotmap = new { };
            // 首页设备报警数据
            var alerts = await _alertService.IndexData();
            // 首页设备检测数据
            var detections = await _detectionService.GetIndexData();
            // 获取天气信息,缓存1小时,如果不存在,则调用WeatherService获取
            Func> getWeatherFunc = async () => await _weatherService.GetWeather();
            var weather = await _cacheManager.GetConvertVale(RedisKeylist.Weather, getWeatherFunc, 60 * 60 * 24 * 30);
            // 获取空气质量,缓存2小时,如果不存在,则调用WeatherService获取
            Func> getAriQualityFunc = async () => await _weatherService.GetAirQuality();
            var ariQuality = await _cacheManager.GetConvertVale(RedisKeylist.AriQuality, getAriQualityFunc, 60 * 60 * 24 * 30);
            Func> getTrendFunc = async () => await _hj212Service.GetIndexData();
            var trend = await _cacheManager.GetConvertVale(RedisKeylist.Trend, getTrendFunc, 60 * 60 * 24 * 30);
            // 获取远程接口污染物排放率
            var rateResp = await _httpProxy.Get>>(null, _configuration.GetValue("Apis:RateUrl"));
            var rate = rateResp.data.ToList().Take(6);
            rate.ForEach(x => x.val = Math.Round(x.val / 100, 2));
            var AlermResp = await _httpProxy.Get>(null, _configuration.GetValue("Apis:AlertUrl"));
            if (AlermResp.code == 0 && AlermResp.data.List.Any())
            {
                alerts.AddRange(AlermResp.data.List);
            }
            //  alerts += await _httpProxy.Get(null, _configuration.GetValue("Apis:AlertUrl"));
            //    alerts += await _httpProxy.Get(null, _configuration.GetValue("Apis:RateUrl"));
            //首页清洁运输比例
            var cleaData = new
            {
                yesterday = 0.8,
                lastWeek = 0.6
            };
            //    var today = await _hj212Service.GetTodayData();
            Func> getTodayFunc = async () => await _hj212Service.GetTodayData();
            var today = await _cacheManager.GetConvertVale(RedisKeylist.Today, getTodayFunc, 60 * 60 * 24 * 1);
            return new ApiResult
            {
                code = 0,
                data = new
                {
                    home = new
                    {
                        center = new
                        {
                            lon = _configuration.GetValue("Home:Center:Lon"),
                            lat = _configuration.GetValue("Home:Center:Lat"),
                        },
                        title = _configuration.GetValue("Home:Title"),
                    },
                    devices,
                    hotmap,
                    weather,
                    ariQuality,
                    rate,
                    trend,
                    alerts,
                    cleanData,
                    today,
                    getViewTop = "",
                    detections
                }
            };
        }
    }
}