using langguanApi.Common.Redis;
using langguanApi.Common;
using langguanApi.Extensions.AutoDI;
using langguanApi.Model;
using System.Linq.Expressions;
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;
        /// 
        /// HomeService
        /// 
        /// 
        /// 
        public HomeService(DeviceService device, Hj212Service hj212Service,
            IConfiguration configuration, CacheManager cacheManager,
            WeatherService weatherService, AlertService alertService,
            DetectionService detectionService)
        {
            _deviceService = device;
            _hj212Service = hj212Service;
            _configuration = configuration;
            _cacheManager = cacheManager;
            _weatherService = weatherService;
            _alertService = alertService;
            _detectionService = detectionService;
        }
        /// 
        /// view
        /// 
        /// 
        public async Task View()
        {
            var devices = await _deviceService.GetAsync();
            var cleanData = new
            {
                Yesterday = 0.8,
                LastWeek = 0.6,
            };
            Expression> filter = exp => true;
            // 首页设备报警数据
            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);
            // 获取空气质量,缓存2小时,如果不存在,则调用WeatherService获取
            Func> getAriQualityFunc = async () => await _weatherService.GetAirQuality();
            var ariQuality = await _cacheManager.GetConvertVale(RedisKeylist.AriQuality, getAriQualityFunc, 60 * 120);
            Func> getTrendFunc = async () => await _hj212Service.GetIndexData();
            var trend = await _cacheManager.GetConvertVale(RedisKeylist.Trend, getTrendFunc, 60 * new Random().Next(70));
            //首页清洁运输比例
            var cleaData = new
            {
                yesterday = 0.8,
                lastWeek = 0.6
            };
            var day = new
            {
                day = new { voc = "70mg/m3", cemes = "100mg/m3" },
                week = new
                {
                }
            };
            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"),
                    },
                    weather,
                    devices,
                    cleanData,
                    ariQuality,
                    rate = new { },
                    trend,
                    // trend = await _hj212Service.GetIndexData(),
                    alerts,
                    getViewTop = "",
                    detections
                }
            };
        }
    }
}