using FLY.Thick.Blowing.IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FLY.Thick.Blowing.Server.Model
{
    /// <summary>
    /// 厚度记录
    /// </summary>
    public class Lc_ScanData
    {
        public Int64 ID { get; set; }

        /// <summary>
        /// 测量数据开始时间
        /// </summary>
        public DateTime Time { get; set; }

        /// <summary>
        /// 测量数据结束时间
        /// </summary>
        public DateTime EndTime { get; set; }

        /// <summary>
        /// 旋转方向 是反向
        /// </summary>
        public bool IsBackw { get; set; }

        /// <summary>
        /// 旋转1周的时间
        /// </summary>
        public TimeSpan RPeriod { get; set; }

        /// <summary>
        /// 旋转次数
        /// </summary>
        public int RCnt { get; set; }

        /// <summary>
        /// 复位区号
        /// </summary>
        public int OrgBoltNo { get; set; }

        /// <summary>
        /// 旋转角度 °
        /// </summary>
        public double RAngle { get; set; }

        /// <summary>
        /// 膜距离 m
        /// </summary>
        public double FilmLength { get; set; }

        /// <summary>
        /// 线速度
        /// </summary>
        public double FilmVelocity { get; set; }

        /// <summary>
        /// 斜率补偿
        /// </summary>
        public double K { get; set; }
        /// <summary>
        /// 1幅数据
        /// </summary>
        public double[] Thicks { get; set; }

        /// <summary>
        /// 分区表
        /// </summary>
        public List<BoltMapCell> Boltmap { get; set; }
    }

    /// <summary>
    /// 纵向厚度记录
    /// </summary>
    public class Lc_TrendData
    {
        public Int64 ID { get; set; }

        /// <summary>
        /// 测量数据开始时间
        /// </summary>
        public DateTime Time { get; set; }

        /// <summary>
        /// 斜率补偿
        /// </summary>
        public double K { get; set; }

        /// <summary>
        /// 纵向厚度 double[] 
        /// 追边时,1分钟1次,1秒一个数据,60个数据
        /// 扫描时,一趟1次,分为螺丝总数/2 个数据
        /// </summary>
        public double[] Thicks { get; set; }
    }

    /// <summary>
    /// LC 与 DB 类的映射关系, 会在程序入口处, 手动使用 
    /// var assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
    /// var cfg = new MapperConfigurationExpression();
    /// cfg.AddMaps(assemblies);
    /// Mapper.Initialize(cfg);
    /// 
    /// 枚举全部程序集 中的AutoMapper.Profile 全部加载!!!
    /// </summary>
    public class Lc_AutoMapperProfile : AutoMapper.Profile
    {
        public Lc_AutoMapperProfile()
        {
            
            CreateMap<Lc_ScanData, Db_ScanData>()
                .ForMember(s => s.RPeriod, opt =>
                {
                    opt.MapFrom(s => s.RPeriod.TotalMinutes);
                })
                .ForMember(s => s.Thicks, opt =>
                {
                    opt.MapFrom(s => Newtonsoft.Json.JsonConvert.SerializeObject(s.Thicks));
                })
                .ForMember(s => s.Boltmap, opt =>
                {
                    opt.MapFrom(s => Newtonsoft.Json.JsonConvert.SerializeObject(s.Boltmap));
                })
            .ReverseMap()
                .ForMember(s => s.RPeriod, opt =>
                {
                    opt.MapFrom(s => TimeSpan.FromMinutes(s.RPeriod));
                })
                .ForMember(s => s.Thicks, opt =>
                {
                    opt.MapFrom(s => Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(s.Thicks));
                })
                .ForMember(s => s.Boltmap, opt =>
                {
                    opt.MapFrom(s => Newtonsoft.Json.JsonConvert.DeserializeObject<List<BoltMapCell>>(s.Boltmap));
                });


            CreateMap<RenZiJiaDataEventArgs, Lc_ScanData>();

            CreateMap<Lc_TrendData, Db_TrendData>()
                .ForMember(s => s.Thicks, opt =>
                {
                    opt.MapFrom(s => Newtonsoft.Json.JsonConvert.SerializeObject(s.Thicks));
                })
            .ReverseMap()
                .ForMember(s => s.Thicks, opt =>
                {
                    opt.MapFrom(s => Newtonsoft.Json.JsonConvert.DeserializeObject<double[]>(s.Thicks));
                })
                ;

        }

        double[] ToRealThicks(int[] frame)
        {
            return frame.Select(t =>
            {
                if (Misc.MyBase.ISVALIDATA(t))
                    return t / 100.0;
                else
                    return double.NaN;
            }).ToArray();
        }
    }
}