#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "linked_list.h"

/*
Связный список (LinkedListPhoneBook)

Узел представляется словарём: `{'name': 'Имя', 'phone': '123', 'next': None}.`

Функции:

def ll_insert(head, name, phone) — проходит до конца (или сразу добавляет в конец) и возвращает новую голову (если вставка в начало) или изменяет список по ссылке. Удобнее возвращать новую голову, если вставка может быть в начало.

def ll_find(head, name) — ищет узел, возвращает телефон или None.

def ll_delete(head, name) — удаляет узел, возвращает новую голову.

def ll_list_all(head) — собирает все записи в список и сортирует (сортировка вынесена отдельно).
*/


int getListNodeLength(Node* HEAD)
{
	int len = 0;

	Node* current = HEAD;
	while (current != NULL)
	{
		len++;
		current = current->next;
	}

	return len;
}

// Добавление в конец
Node* insert(Node* head, char name[NAME_BUFF_SIZE], char phone[PHONE_BUFF_SIZE], int show)
{
	Node* newNode = (Node*)malloc(sizeof(Node));
	
	strcpy_s(newNode->name_, NAME_BUFF_SIZE, name);
	strcpy_s(newNode->phone_, PHONE_BUFF_SIZE, phone);
	newNode->next = NULL;
	
	printf("Data: %s %s\n", name, phone);
	printf("New Data: %s %s\n", newNode->name_, newNode->phone_);
	
	if (head == NULL)
{
		printf("\nNew list\n");
		head = newNode;
		return newNode;
	}

	Node* last = head;
	int ind = 0;
	while (last->next != NULL)
	{
		if (show == 1)
			printf("%d \n", ind++);
		last = last->next;
	}

	last->next = newNode;
	return head;
}

char* find(Node* HEAD, char target_name[NAME_BUFF_SIZE])
{
	Node* current = HEAD;

	while (current != NULL)
	{
		
		if (strcmp(target_name, current->name_) == 0)
		{
			return current->phone_;
		}

		current = current->next;
	}
	return NULL;
}

// Вывод всех элементов
void printAllNodes(Node* head)
{
	Node* current = head;
	int ind = 0;

	while (current != NULL)
	{
		printf("Ind: %d\nName: %s\nPhone: %s\n", ind++, current->name_, current->phone_);
		current = current->next;
	}
}

Node* deleteNode(Node* HEAD, char target_name[NAME_BUFF_SIZE])
{
	Node* previous = NULL;
	Node* current = HEAD;

	if (current != NULL && strcmp(target_name, current->name_) == 0)
	{
		HEAD = current->next;
		free(current);

		return HEAD;
	}

	while (current != NULL && strcmp(target_name, current->name_) == 0)
	{
		previous = current;
		current = current->next;
	}

	if (current == NULL) return HEAD;

	previous->next = current->next;
	free(current);

	return HEAD;
}

Node* listAll(Node* HEAD)
{
	if (HEAD == NULL)
	{
		return NULL;
	}

	int len = getListNodeLength(HEAD);
	Node* current = HEAD;

	Node* list = (Node*)malloc(len * sizeof(Node));
	
	int ind = 0;
	while (current != NULL)
	{
		list[ind++] = *current;		
		current = current->next;
	}

	return list;
}

void printNode(Node node)
{
	printf("%s ", node.name_);
	printf("%s\n", node.phone_);
}

void printListNode(Node* list, int length)
{	
	printf("\n\n%d\n", length);
	for (int i = 0; i < length; i++)
	{
		printNode(list[i]);
	}
}



