using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;

namespace WebManager
{
    public class WebResult
    {
        #region
        /// <summary>
        /// 数据定义
        /// </summary>
        private String webServer_IP = "";
        private String webServer_Port = "";
        private String webServer_Path = "";
        private String Url = "";
        private const String Post = "Post";
        private const String Content_Type= "Content-Type:application/json";

        #endregion

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="ws_ip">WebServer的IP地址</param>
        /// <param name="ws_port">WebServer的端口号</param>
        public WebResult(String ws_ip,String ws_port)
        {
            this.webServer_IP = ws_ip;
            this.webServer_Port = ws_port;
            //更新Web网址
            Update_Url();
        }

        /// <summary>
        /// 更新Web网址
        /// </summary>
        private void Update_Url()
        {
            this.webServer_Path = "/" + this.webServer_Path;
            this.Url = "http://" + this.webServer_IP + ":" + this.webServer_Port + this.webServer_Path;
        }

        /// <summary>
        /// WebServer的IP地址
        /// </summary>
        public String WebServer_IP
        {
            //get { return this.webServer_IP; }
            set
            {
                this.webServer_IP = value;
            }
        }

        /// <summary>
        /// WebServer的端口号
        /// </summary>
        public String WebServer_Port
        {
            //get { return this.webServer_IP; }
            set
            {
                this.webServer_Port = value;
            }
        }

        /// <summary>
        /// 向WebServer请求数据及返回结果
        /// </summary>
        /// <param name="postString">请求数据的JSON</param>
        /// <returns>返回结果的JSON</returns>
        private String RequestString(String postString)
        {
            try
            {
                String res = HttpRequestHelper.DoRequest(this.Url, Post, Content_Type, postString);
                return res;
            }
            catch
            {
                return "";
            }
        }

        /// <summary>
        /// 计算原始图像偏移角度及方向
        /// </summary>
        /// <param name="imagePath">图片路径</param>
        /// <param name="imageType">孔类型</param>
        /// <param name="firm">厂家类型</param>
        /// <returns>json字符串</returns>
        public void Img_OffsetAngle_Direction(String imagePath, int imageType, String firm, out double degree, out int direction, out int state)
        {
            this.webServer_Path = "FIB_degree_recognize";
            Update_Url();
            JObject json = new JObject();
            json.Add("img_path", imagePath);
            json.Add("img_type", imageType);
            json.Add("firm", firm);
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret= (JObject)JsonConvert.DeserializeObject(res);

            if (jret != null && jret.Property("img_name") != null && jret.Property("img_name").ToString() != "")
            {
                JObject jname = JObject.Parse(jret["img_name"].ToString());
                degree = Convert.ToDouble(jname["degree"].ToString());
                direction = Convert.ToInt32(jname["direction"].ToString());
                state = Convert.ToInt32(jname["state"].ToString());
            }
            else
            {
                state = 0;
                direction = 0;
                degree = 0;
            }
        }

        /// <summary>
        /// 计算切割点位置
        /// </summary>
        /// <param name="imagePath">图片路径</param>
        /// <param name="imageType">孔类型</param>
        /// <param name="firm">厂家类型</param>
        /// <returns>json字符串</returns>
        public void Img_Cut_Position(String imagePath, int imageType, String firm, out double offsetx, out double offsety, out int state)
        {
            this.webServer_Path = "test2";
            Update_Url();
            JObject json = new JObject();
            json.Add("img_path", imagePath);
            json.Add("img_type", imageType);
            json.Add("firm", firm);
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret = (JObject)JsonConvert.DeserializeObject(res);
            if (jret != null && jret.Property("img_name") != null && jret.Property("img_name").ToString() != "")
            {
                JObject jname = JObject.Parse(jret["img_name"].ToString());
                JArray jlocation = JArray.Parse(jname["location"].ToString());
                offsetx = Convert.ToDouble(jlocation[0].ToString());
                offsety = Convert.ToDouble(jlocation[1].ToString());
                state = Convert.ToInt32(jname["state"].ToString());
            }
            else
            {
                state = 0;
                offsetx = 0;
                offsety = 0;
            }
        }

        /// <summary>
        /// 是否切割成功验证
        /// </summary>
        /// <param name="imageBefore">切割前图像路径</param>
        /// <param name="imageAfter">切割后图像路径</param>
        /// <returns>json字符串</returns>
        public void Img_Cut_Success(String imageBefore, String imageAfter, out int state)
        {
            this.webServer_Path = "FIB_verify";
            Update_Url();
            JObject json = new JObject();
            json.Add("img_before_path", imageBefore);
            json.Add("img_after_path", imageAfter);
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret = (JObject)JsonConvert.DeserializeObject(res);
            if (jret != null && jret.Property("state") != null && jret.Property("state").ToString() != "")
            {
                state = Convert.ToInt32(jret["state"].ToString());
            }
            else
            {
                state = 0;
            }
        }

        /// <summary>
        /// 计算切割后图像梯形区域上边中心点坐标
        /// </summary>
        /// <param name="imagePath">图片路径</param>
        /// <returns>json字符串</returns>
        public void Img_Trapezoid_Top_Center_Position(String imagePath, out double offsetx, out double offsety, out int state)
        {
            this.webServer_Path = "test4";
            Update_Url();
            JObject json = new JObject();
            json.Add("img_path", imagePath);
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret = (JObject)JsonConvert.DeserializeObject(res);
            if (jret != null && jret.Property("img_name") != null && jret.Property("img_name").ToString() != "")
            {
                JObject jname = JObject.Parse(jret["img_name"].ToString());
                JArray jlocation = JArray.Parse(jname["top_center"].ToString());
                offsetx = Convert.ToDouble(jlocation[0].ToString());
                offsety = Convert.ToDouble(jlocation[1].ToString());
                state = Convert.ToInt32(jname["state"].ToString());
            }
            else
            {
                state = 0;
                offsetx = 0;
                offsety = 0;
            }
        }

        /// <summary>
        /// 自动对焦
        /// </summary>
        /// <param name="imagePath">一组图片路径</param>
        /// <returns>json字符串</returns>
        public String Img_Auto_Focus(List<String> imagePath)
        {
            this.webServer_Path = "test5";
            Update_Url();
            JObject json = new JObject();
            for(int i=0;i<imagePath.Count;i++)
            {
                json.Add("img_path" + i.ToString(), imagePath[i]);
            }
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret = (JObject)JsonConvert.DeserializeObject(res);
            if (jret != null && jret.Property("img_path") != null && jret.Property("img_path").ToString() != "")
            {
                return jret["img_path"].ToString();
            }
            else
            {
                return "";
            }
        }

        /// <summary>
        /// 自动消像散
        /// </summary>
        /// <param name="imagePath">一组图片路径</param>
        /// <returns>json字符串</returns>
        public String Img_Auto_Stigmatic(List<String> imagePath)
        {
            this.webServer_Path = "test6";
            Update_Url();
            JObject json = new JObject();
            for (int i = 0; i < imagePath.Count; i++)
            {
                json.Add("img_path" + i.ToString(), imagePath[i]);
            }
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret = (JObject)JsonConvert.DeserializeObject(res);
            if (jret != null && jret.Property("img_path") != null && jret.Property("img_path").ToString() != "")
            {
                return jret["img_path"].ToString();
            }
            else
            {
                return "";
            }
        }

        /// <summary>
        /// 计算切割面区域中心坐标，以及偏移角度及方向
        /// </summary>
        /// <param name="imagePath">图片路径</param>
        /// <returns>json字符串</returns>
        public void Img_Center_Position_OffsetAngle_Direction(String imagePath, int imageType, String firm, out double offsetx, out double offsety, out double degree, out int direction, out int state)
        {
            this.webServer_Path = "test7";
            Update_Url();
            JObject json = new JObject();
            json.Add("img_path", imagePath);
            json.Add("img_type", imageType);
            json.Add("firm", firm);
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret = (JObject)JsonConvert.DeserializeObject(res);
            if (jret != null && jret.Property("img_name") != null && jret.Property("img_name").ToString() != "")
            {
                JObject jname = JObject.Parse(jret["img_name"].ToString());
                JArray jlocation = JArray.Parse(jname["center"].ToString());
                offsetx = Convert.ToDouble(jlocation[0].ToString());
                offsety = Convert.ToDouble(jlocation[1].ToString());
                state = Convert.ToInt32(jname["state"].ToString());
                degree = Convert.ToDouble(jname["degree"].ToString());
                direction = Convert.ToInt32(jname["direction"].ToString());

            }
            else
            {
                state = 0;
                direction = 0;
                degree = 0;
                offsetx = 0;
                offsety = 0;
            }
        }

        /// <summary>
        /// 测量尺寸
        /// </summary>
        /// <param name="imagePath">图片路径</param>
        /// <param name="ratio">放大倍数</param>
        /// <param name="size">一像素代表**mm/um</param>
        /// <returns>json字符串</returns>
        public void Img_Measure_Size(String imagePath, String ratio, String size, out int state)
        {
            this.webServer_Path = "test8";
            Update_Url();
            JObject json = new JObject();
            json.Add("img_path", imagePath);
            json.Add("ratio", ratio);
            json.Add("size", size);
            String res = RequestString(JsonConvert.SerializeObject(json));
            JObject jret = (JObject)JsonConvert.DeserializeObject(res);
            if (jret != null && jret.Property("img_name") != null && jret.Property("img_name").ToString() != "")
            {
                JObject jstate = JObject.Parse(jret["img_name"].ToString());
                state = Convert.ToInt32(jstate["state"].ToString());
            }
            else
            {
                state = 0;
            }
        }
    }
}
