package ceres.service;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class MyTCPServer {
    private static final String TAG = "TCPServer";
    private static int PORT = 4002;
    private static MyTCPServer mMyTCPServer;

    private TCPServerThread mServerThread;
    private Context mContext;

    private BufferedReader mInputBuffer;
    private BufferedWriter mOutputBuffer;

    private Handler mHandler;

    public MyTCPServer(Context context, Handler handler) {
        mContext = context;
        mHandler = handler;
        Log.d(TAG, "MyTCPServer: ");
    }

    public static MyTCPServer getInstance(Context context, Handler handler) {

        Log.d(TAG, "getInstance: ");
        if (mMyTCPServer == null) {
            Log.d(TAG, "getInstance: 1");
            mMyTCPServer = new MyTCPServer(context, handler);
        }

        return mMyTCPServer;
    }

    public void start() {
        if (mServerThread == null) {
            Log.d(TAG, "start(): ");
            mServerThread = new TCPServerThread();
            mServerThread.start();
        }
    }

    class TCPServerThread extends Thread {
        private Boolean working;
        private ServerSocket mServerSocket;
        private Socket client;
        private String clientIP;
        DataOutputStream output;
        DataInputStream input;

        public TCPServerThread() {
            working = true;
        }

        @Override
        public void run() {
            Thread.currentThread().setName("MyTCPServer");
            try {
                //ServerSocketFactory factory = SSLServerSocketFactory.getDefault();
                //mServerSocket = factory.createServerSocket(PORT);
                Log.d(TAG, "TCPServerThread(): ");
                mServerSocket = new ServerSocket(PORT);

                while(working) {
                    Log.d(TAG, "TCPServerThread(): 1");
                    // 리스닝
                    client = mServerSocket.accept(); // Listens for a connection to be made to this socket and accepts it.
                    clientIP = client.getInetAddress().getHostAddress();

                    mOutputBuffer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                    mInputBuffer = new BufferedReader(new InputStreamReader(client.getInputStream()), 10);

                    String data;
                    while (! client.isClosed()) {
                        //Log.d(TAG, "TCPServerThread(): 2");
                        if ((data = mInputBuffer.readLine()) != null) {
                            Log.d(TAG, "read: " + data);
                            if (data.equals("HEY")) {
                                mOutputBuffer.write("ACK", 0, "ACK".length());
                                mOutputBuffer.flush();
                                Message msg = mHandler.obtainMessage(100, clientIP);
                                mHandler.sendMessage(msg);
                            }

                        }

                    }
                }
            } catch (IOException e) {
                Log.v(TAG, "Fail TCPServer!!");
                e.printStackTrace();
            }
        }

        public void cancel() {
            working = false;
        }

    }
}