using System.IO;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Runtime.Serialization;
using System.Collections.Generic;
using CameraVisionLib.Model;
using System.Drawing;
using System.Reflection;

namespace Model
{
    [ServiceContract(Name = "Services")]
    public interface IWeb
    {
        [OperationContract]
        [WebGet(UriTemplate = "NeoScan/CloseApp", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        void CloseApp();

        [OperationContract]
        [WebGet(UriTemplate = "NeoScan/WorkWithCamera", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        WebResultCamera WorkWithCamera();

        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "NeoScan/WorkWithCode", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        WebResultCode WorkWithCode(Stream json);
        [OperationContract]
        [WebGet(UriTemplate = "alive", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        string alive();

        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "NeoScan/ProcessBitmap?param={param}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        WebResultCode ProcessBitmap(Stream info, string param);

        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "NeoScan/ProcessBitmaps",
        BodyStyle = WebMessageBodyStyle.Bare,
        RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        WebResultCode ProcessBitmaps(BitmapData bitmapData);
    }

    [DataContract]
    public class WebResultCamera
    {
        [DataMember]
        public int ErrorCode { get; set; }
        [DataMember]
        public string Msg { get; set; }
        [DataMember]
        public WebCodeAll[] Data { get; set; }

        public WebResultCamera()
        {
            ErrorCode = 0;
            Msg = "OK";
        }
    }

    [DataContract]
    public class WebResultCode
    { 
        [DataMember]
        public int ErrorCode { get; set; }
        [DataMember]
        public string Msg { get; set; }
        [DataMember]
        public WebCodeText[] Data { get; set; }
        [DataMember]
        public List<KeyValuePair<string, string>> workCodeKeyword;
        [DataMember]
        public List<BarcodeInfo> workCodeInfo = new List<BarcodeInfo>();

        [DataMember]
        public NewPositionAngle  PositionAngle { get; set; }
        public WebResultCode()
        {
            ErrorCode = 0;
            Msg = "OK";
        }
    }

    public class WebCodeAll
    {
        public string Text { get; set; } = "";
        public string CodeType { get; set; } = "";
        public float CenterX { get; set; } = 0;
        public float CenterY { get; set; } = 0;
        public float Angle { get; set; } = 0;
        public float Width { get; set; } = 0;
        public float Height { get; set; } = 0;
        public bool IsUsed { get; set; } = false;

    }

    public class WebCodeText
    {
        public string Text { get; set; } = "";
        public bool IsUsed { get; set; } = false;

    }

    [DataContract]
    public class BitmapData
    {
        [DataMember]
        public string ImageData { get; set; }

        [DataMember]
        public List<BarcodeInfos> BarCodeList { get; set; }

       /// <summary>
       /// 中心点xy
       /// </summary>
        [DataMember]
        public int X { get; set; }
        [DataMember]
        public int Y { get; set; }
        [DataMember]
        public bool IsIDCamera { get; set; }

        [DataMember]
        public int PlateW { get; set; }
    }
    [DataContract]
    public class BarcodeInfos
    {
        //
        // 摘要:
        //     文本
        [DataMember]
        public string Text { get; set; }

        //
        // 摘要:
        //     条码类型
        [DataMember]
        public string CodeType { get; set; }

        //
        // 摘要:
        //     中心点
        //[DataMember]
        //public PointF Center { get; set; }
        [DataMember]
        public int X { get; set; }
        [DataMember]
        public int Y { get; set; }
        ////
        //// 摘要:
        ////     条码尺寸大小
        //[DataMember]
        //public SizeF Size { get; set; }

        //
        // 摘要:
        //     角度,3点钟方向0°,逆时针为正,顺时针为负。
        [DataMember]
        public float Angle { get; set; }

        

        //
        // 摘要:
        //     原点垂直于经过中心点的直线的距离
        [DataMember]
        public float Distance { get; set; }        
    }
}