using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine;

public class Crane : MonoBehaviour
{
    private Thread receiveThread;
    private Socket client;
    private byte[] buffer;
    private string strBuffer;
    private bool isReceiving;
    private string plcAddress = "127.0.0.1";
    private int port = 8081;
    private float x;
    private float y;
    private float z = 0;
    private float xDelta;
    private float yDelta;
    private float zDelta;
    private float xOffset= 68;
    private float yOffset=72;
    private float zOffset=-409;
    // Start is called before the first frame update
    void Start()
    {
        buffer = new byte[305];
        Debug.Log("start to connect plc");
        connect();
        Debug.Log("connected plc");
       
        isReceiving = true;

        StartReceiveThread();
    }

    // Update is called once per frame
    void Update()
    {
        //Vector3 position = new Vector3(x + xOffset, y + yOffset, zOffset + z);
        //this.transform.position = position;
        this.transform.Translate(0, 0, zDelta * Time.deltaTime, Space.World);

    }
    private void connect()
    {
        try
        {
            IPAddress ip = IPAddress.Parse(plcAddress);
            IPEndPoint ipe = new IPEndPoint(ip, port);
            client = new Socket(SocketType.Stream, ProtocolType.Tcp);
            client.NoDelay = true;
            client.Connect(ipe);
            
        }
        catch(Exception ex)
        {
            Debug.LogError(ex.Message);
        }
        
    }
    private void StartReceiveThread()
    {
        receiveThread = new Thread(new ThreadStart(Receive));
        receiveThread.Start();
    }
    public void Receive()
    {
        try
        {
            while (isReceiving)
            {
                client.Receive(buffer);
                strBuffer = System.Text.Encoding.Default.GetString(buffer);
                Debug.Log(strBuffer.Length+";"+strBuffer);

                float newX = float.Parse(strBuffer.Substring(52, 7).Trim());
                float newY= float.Parse(strBuffer.Substring(59, 7).Trim()); 
                float newZ= float.Parse(strBuffer.Substring(66, 7).Trim());
                xDelta = newX - x;
                yDelta = newY - y;
                zDelta = newZ - z;
                x = newX/100;
                y = newY/100;
                Debug.Log("zDelta:" + zDelta);
                z = newZ;

               // x = x / 100;
              //  y = y / 100;
               // z = z / 100;

                Debug.Log("X:"+x+",Y:"+y+",Z:"+z);
            }
        }
        catch(Exception ex)
        {
            Debug.LogError(ex.Message);
        }
    }
    public void OnDestroy()
    {

        client.Close();
        isReceiving = false;
        receiveThread.Abort();
      
    }
}