#include <iostream>
#include <WinSock2.h>
#include <string>

int main(void)
{
	std::cout << "클라이언트 시작" << std::endl;

	WSADATA wsaData;
	SOCKET hSocket;
	SOCKADDR_IN serverAddr;

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		return 1;
	}

	hSocket = socket(PF_INET, SOCK_STREAM, 0);

	if (hSocket == INVALID_SOCKET)
	{
		return 1;
	}

	memset(&serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddr.sin_port = htons(50000);

	if (connect(hSocket, (SOCKADDR *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
	{
		return 1;
	}

	char message[1024] = {0};

	while (1)
	{
		std::cout << "==========================================================" << std::endl;
		std::string input;
		std::cout << "계산할 수식을 입력하세요." << std::endl;
		std::cout << "정수, 소수, 음수, +, -, *, /, (, ) 사용가능" << std::endl;
		std::cout << "계산할 수식 :: ";
		std::getline(std::cin, input);

		// std::cout << "input.size() :: " << input.size() << std::endl;

		// 보내기
		if (send(hSocket, input.c_str(), input.size(), 0) == SOCKET_ERROR)
		{
			std::cout << "서버로 송신 실패" << std::endl;
			return 1;
		}
		else
		{
			std::cout << "서버로 송신 성공 :: " << input << std::endl;
		}

		// 받기
		memset(message, 0, sizeof(message));
		if (recv(hSocket, message, sizeof(message) - 1, 0) == SOCKET_ERROR)
		{
			std::cout << "서버에서 수신 실패" << std::endl;
			continue;
		}
		else
		{
			std::cout << "서버에서 수신 성공" << std::endl;
			switch (message[0])
			{
			case '0' :
				{
					char temp[1024] = {0};
					memcpy(temp, message + 1, strlen(message) - 1);
					std::cout << "정답 :: " << temp << std::endl;
				}
				break;
			case '1' :
				std::cout << "잘못된 수식입니다. (연산자가 이중으로 있습니다.)" << std::endl;
				break;
			case '2' :
				std::cout << "잘못된 수식입니다. (수식의 끝에 연산자가 있습니다.)" << std::endl;
				break;
			case '3' :
				std::cout << "잘못된 수식입니다. (수식의 괄호의 수가 맞지 않거나 순서에 문제가 있습니다.)" << std::endl;
				break;
			case '4' :
				std::cout << "잘못된 수식입니다. (수식에 문자가 포함될 수 없습니다.)" << std::endl;
				break;
			case '5' :
				std::cout << "잘못된 수식입니다. (상수는 0으로 나눌 수 없습니다.)" << std::endl;
				break;
			case '6' :
				std::cout << "잘못된 수식이거나 계산에 문제가 있습니다. (0을 0으로 나눌 수 없습니다.)" << std::endl;
				break;
			default :
				break;
			}
		}
	}

	closesocket(hSocket);
	WSACleanup();

	return 0;
}