using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace FLY.Thick.Blowing.IService
{
    /// <summary>
    /// 基本吹膜系统
    /// </summary>
    public interface IBlowing : INotifyPropertyChanged
    {
        #region 分区设定
        /// <summary>
        /// 加热通道数
        /// </summary>
        int ChannelCnt { get; set; }

        /// <summary>
        /// 分区数/加热通道数
        /// </summary>
        int BPC { get; set; }

        /// <summary>
        /// 人字架总分区数,从1开始数
        /// </summary>
        int NBolts { get; }

        /// <summary>
        /// 人字架复位时, 探头对应的分区位, 也就是 0° 对应的分区位
        /// </summary>
        int OrgBoltNo { get; set; }

        /// <summary>
        /// 使用分区表
        /// </summary>
        bool IsUsedMap { get; set; }
        /// <summary>
        /// 分区表,必须保证不能为null
        /// </summary>
        List<BoltMapCell> Map { get; set; } 
        #endregion

        /// <summary>
        /// 参数应用
        /// </summary>
        void Apply();

        /// <summary>
        /// 每次有新数据时候推送。 修改参数,不会推送
        /// </summary>
        event RenZiJiaDataEventHandler DataEvent;
    }

    /// <summary>
    /// 扫描一次,推送
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public delegate void RenZiJiaDataEventHandler(object sender, RenZiJiaDataEventArgs e);

    /// <summary>
    /// 扫描一次,推送的数据
    /// </summary>
    public class RenZiJiaDataEventArgs : EventArgs
    {
        /// <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; } = 1;

        /// <summary>
        /// 1幅数据
        /// </summary>
        public double[] Thicks { get; set; }

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

    /// <summary>
    /// 分区表
    /// </summary>
    public class BoltMapCell
    {
        /// <summary>
        /// 旧位置
        /// </summary>
        public int OldNo { get; set; }
        /// <summary>
        /// 新位置
        /// </summary>

        public int NewNo { get; set; }

        /// <summary>
        /// 全复制
        /// </summary>
        /// <returns></returns>
        public BoltMapCell Clone()
        {
            return new BoltMapCell() { NewNo = NewNo, OldNo = OldNo };
        }
    }


}