#include "logging.h"

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#include "structures.h"
#include "utils.h"

void
log_client_data(struct sockaddr_storage client_addr, char* log_file,
                int debug_flag, REQUEST* request)
{

	FILE* log_file_read = fopen(log_file, "a");
	if (log_file_read == NULL)
	{
		fprintf(stderr, "%s: unable to open log file: fopen: %s\n",
		        getprogname(), strerror(errno));
		exit(EXIT_FAILURE);
	}

	char client_ip[INET6_ADDRSTRLEN]; // This is large enough for both IPv4 and
	                                  // IPv6

	// This changes request->request_passedin but we dont care since we dont use
	// it again
	char* formatted_request_passedin =
		strtok(request->request_passedin, "\r\n");

	if (formatted_request_passedin == NULL)
	{
		fprintf(stderr, "%s: unable to format request->request_passedin",
		        getprogname());
		exit(EXIT_FAILURE);
	}

	if (client_addr.ss_family == AF_INET)
	{
		struct sockaddr_in* ipv4_client = (struct sockaddr_in*)&client_addr;
		inet_ntop(AF_INET, &ipv4_client->sin_addr, client_ip,
		          sizeof(client_ip));
		if (debug_flag)
		{
			printf("[Debug] %s:%d %s \"%s\" %d %zu\n", client_ip,
			       ntohs(ipv4_client->sin_port), request->request_time,
			       formatted_request_passedin, request->status,
			       request->response_size);
		}
		else
		{
			fprintf(log_file_read, "%s:%d %s \"%s\" %d %zu\n", client_ip,
			        ntohs(ipv4_client->sin_port), request->request_time,
			        formatted_request_passedin, request->status,
			        request->response_size);
		}
	}

	else if (client_addr.ss_family == AF_INET6)
	{
		struct sockaddr_in6* ipv6_client = (struct sockaddr_in6*)&client_addr;
		inet_ntop(AF_INET6, &ipv6_client->sin6_addr, client_ip,
		          sizeof(client_ip));
		if (debug_flag)
		{
			printf("[Debug] %s:%d %s \"%s\" %d %zu\n", client_ip,
			       ntohs(ipv6_client->sin6_port), request->request_time,
			       formatted_request_passedin, request->status,
			       request->response_size);
		}
		else
		{
			fprintf(log_file_read, "%s:%d %s \"%s\" %d %zu\n", client_ip,
			        ntohs(ipv6_client->sin6_port), request->request_time,
			        formatted_request_passedin, request->status,
			        request->response_size);
		}
	}

	fclose(log_file_read);
}