package main

import (
	"errors"
	"fmt"
	"os"
	"strconv"
	"strings"

	"github.com/fatih/color"
)

func check(err error) {
	if err != nil {
		fmt.Fprintf(os.Stderr, "[ERR] %s", err)
	}
}

type Todo struct {
	Title   string
	Content string
}

type Todos struct {
	Items []Todo
}

func (todo *Todos) AddTodo(newTodo Todo) {
	todo.Items = append(todo.Items, newTodo)
}

func (todo *Todos) RemoveTodo(index int) (err error) {
	//remove todo via index
	if len(todo.Items) == 0 {
		return errors.New("[ERR] Todo list is empty!\n")
	}

	if index > len(todo.Items) {
		return errors.New("[ERR] Index out of bounds\n")
	}

	todo.Items = append(todo.Items[:index], todo.Items[index+1:]...)
	return nil
}

func (todo *Todos) ListTodo() (err error) {
	// Create a custom print function for convenience
	id := color.New(color.Bold, color.FgGreen).PrintfFunc()
	title := color.New(color.Bold, color.FgBlue).PrintfFunc()
	content := color.New(color.Bold, color.FgWhite).PrintfFunc()

	if len(todo.Items) == 0 {
		return errors.New("[ERR] Todo list is empty!\n")
	}
	for k, v := range todo.Items {
		id("[%d]", k)
		title("%s", v.Title)
		content("%s\n", v.Content)
	}
	return nil
}

func (todo *Todos) SaveToFile(filename string) error {
	var sb strings.Builder
	var FILE *os.File

	filename = filename + ".txt"
	for k, v := range todo.Items {
		fmt.Printf("#%d,%s,%s;\n", k, strings.ReplaceAll(v.Title, "\n", ""), strings.ReplaceAll(v.Content, "\n", ""))
		sb.WriteString(strconv.Itoa(k))
		sb.WriteString(",")
		sb.WriteString(strings.ReplaceAll(v.Title, "\n", ""))
		sb.WriteString(",")
		sb.WriteString(strings.ReplaceAll(v.Content, "\n", ""))
		sb.WriteString(";\n")
	}

	content := sb.String()

	fmt.Println(content)

	if _, err := os.Stat(filename); err != nil {
		if FILE, err = os.Create(filename); err != nil {
			return errors.New("[ERR] could not create file \n")
		}
		return errors.New("[ERR] file does not exist, creating one...\n")
	}
	FILE, _ = os.Create(filename) //errors already handled

	if _, err := FILE.WriteString(content); err != nil {
		return err
		//return errors.New("[ERR] could not write to file\n")
	}

	sb.Reset()   //reset the string builder
	FILE.Close() //close the file
	return nil
}
