package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"os"
	"sync"

	"github.com/gocarina/gocsv"
)

type (
	NeighbourhoodOld struct {
		IDBairro  string `csv:"id_bairro"`
		Bairro    string `csv:"bairro"`
		IDUnidade string `csv:"-"`
	}
	Neighbourhood struct {
		ID        string `csv:"id"`
		Name      string `csv:"name"`
		CreatedAt string `csv:"created_at"`
		UpdatedAt string `csv:"updated_at"`
	}
)

func ExecNeighbourhoods(wg *sync.WaitGroup) {
	defer wg.Done()
	records := extractNeighbourhoodsOld()
	createNeighbourhoodsCsv(records)
}

func extractNeighbourhoodsOld() []NeighbourhoodOld {
	fmt.Println(Yellow + "Extracting neighbourhoods" + Reset)
	csvFile, err := os.Open("files/TB_SOPA_BAIRROS_ANGRA.csv")
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		panic(err)
	}
	defer csvFile.Close()

	reader := csv.NewReader(csvFile)
	reader.Comma = ','

	var records []NeighbourhoodOld
	if err := gocsv.UnmarshalCSV(reader, &records); err != nil {
		fmt.Println(Red + err.Error() + Reset)
		panic(err)
	}
	if len(records) == 0 {
		panic("No records found")
	}

	return records
}

func createNeighbourhoodsCsv(records []NeighbourhoodOld) {
	file, err := os.Create(basePath + "neighbourhoods.csv")
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		panic(err)
	}
	defer file.Close()

	var neighbourhoods []*Neighbourhood
	for _, record := range records {
		neighbourhood := &Neighbourhood{
			ID:        record.IDBairro,
			Name:      record.Bairro,
			CreatedAt: "2023-08-01 00:00:00",
			UpdatedAt: "2023-08-01 00:00:00",
		}
		neighbourhoods = append(neighbourhoods, neighbourhood)
	}

	gocsv.SetCSVWriter(func(out io.Writer) *gocsv.SafeCSVWriter {
		writer := csv.NewWriter(out)
		writer.Comma = '\t' // Ensure tab delimiter is used
		return gocsv.NewSafeCSVWriter(writer)
	})

	err = gocsv.MarshalFile(&neighbourhoods, file)
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		panic(err)
	}

	fmt.Println(Green + "Successfully created CSV file with the processed neighbourhoods." + Reset)
}
