using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using QFramework;
using TCPClientTools;
using System;

public class TCPMangerArchitecture : Architecture<TCPMangerArchitecture>
{
    protected override void Init()
    {
        this.RegisterUtility(new TCPUtility());
        this.RegisterModel(new TCPEventModel());
    }
}
public class TCPClientView : MonoBehaviour,IController,ICanSendEvent
{
    public UnityEvent onRecievedOpenDevice;
    public UnityEvent onTCPLinkSuccess;
    public UnityEvent onTCPLinkFaild;
    public UnityEvent onServerConnected;
    public UnityEvent onTCPReLink;

    private string tcpAddress;
    private int tcpPort;
    private int deviceId;
    // Start is called before the first frame update
    void Awake()
    {
        initTCPService();
        DontDestroyOnLoad(this);
    }

    public void initTCPService() {
        tcpAddress = "127.0.0.1";
        tcpPort = 20000;
        deviceId = 1;

        GetArchitecture().RegisterEvent<TCPStateChangedEvent>(e => {
            if (e.state == TCPLinkState.Linking)
            {
                Debug.Log("TCP��ʼ����");
                this.GetModel<TCPEventModel>().linkServer();
            }
            if (e.state == TCPLinkState.LinkSucess)
            {
                Debug.Log("TCP���ӳɹ�");
                this.GetModel<TCPEventModel>().onReceive<LinkSuccessResponse>();
                this.GetModel<TCPEventModel>().sendRequestCommand(new LinkTCPRequest(deviceId));
                onTCPLinkSuccess.Invoke();
            }
            if (e.state == TCPLinkState.LinkFaild)
            {
                Debug.Log("TCP����ʧ�ܣ�����ϵ�豸�������Ա");
                onTCPLinkFaild.Invoke();
            }
        });

        GetArchitecture().RegisterEvent<ResponseMsgEvent>(e =>
        {
            if (e.res.GetType() == typeof(LinkSuccessResponse))
            {
                Debug.Log("Link Server success");
                this.GetModel<TCPEventModel>().offReceive<LinkSuccessResponse>();
                onServerConnected.Invoke();
            }
        });

        this.GetModel<TCPEventModel>().setTCPState(TCPLinkState.NoIp);
        this.GetModel<TCPEventModel>().setIP(tcpAddress, tcpPort);
    }

    public void restartTCPService() {
        onTCPReLink.Invoke();
        this.GetModel<TCPEventModel>().closeServer();
        StartCoroutine(waitTwoSecond());
    }
    public IEnumerator waitTwoSecond() {
        yield return new WaitForSeconds(2.0f);
        this.GetModel<TCPEventModel>().setTCPState(TCPLinkState.Linking);
    }
    public IArchitecture GetArchitecture()
    {
        return TCPMangerArchitecture.Interface;
    }
}
public class LinkSuccessResponse : AbstractResponse
{
    public string code;
    public string data;
    public string msg;
    public LinkSuccessResponse() {
        this.code = "";
        this.data = "";
        this.msg = "";
    }
}

public class LinkTCPRequest :IRequest{
    public string id;
    public int type;
    public LinkTCPRequest(int id) {
        this.id = id.ToString();
        this.type = 1;
    }
    public string toJson()
    {
        return JsonUtility.ToJson(this);
    }
}