package main

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

	"github.com/gocarina/gocsv"
)

type (
	LanguageOld struct {
		IDIdioma  int    `csv:"id_idioma"`  // Corrected to match the CSV header "id_idioma"
		IDUsuario int    `csv:"id_usuario"` // Corrected to match the CSV header "id_usuario"
		CdIdioma  int    `csv:"cd_idioma"`  // Correct as per CSV header "cd_idioma"
		CdNivel   int    `csv:"cd_nivel"`   // Correct as per CSV header "cd_nivel"
		DSOutros  string `csv:"ds_outros"`  // Correct as per CSV header "ds_outros"
	}
	Language struct {
		CandidateId           int `csv:"candidate_id"`
		LanguageId            int `csv:"language_id"`
		LanguageProficiencyId int `csv:"language_proficiency_id"`
	}
)

func ExecLanguages(wg *sync.WaitGroup) {
	defer wg.Done()
	records := extractLanguagesOld()
	createLanguageCsv(records)
}

func extractLanguagesOld() []LanguageOld {
	fmt.Println(Yellow + "Extracting languages" + Reset)
	csvFile, err := os.Open("files/TB_SOPA_BC_IDIOMA.csv")

	if err != nil {
		panic(err)
	}
	defer csvFile.Close()

	// Create a new CSV reader with tab as the delimiter
	reader := csv.NewReader(csvFile)
	reader.Comma = ',' // Set the delimiter to tab

	var records []LanguageOld
	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 createLanguageCsv(records []LanguageOld) {
	file, err := os.Create(basePath + "languages.csv")
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		panic(err)
	}
	defer file.Close()

	var languages []*Language
	for _, record := range records {
        if record.CdNivel == 0 {
            record.CdNivel = 1
        }
		language := &Language{
			CandidateId:           record.IDUsuario,
			LanguageId:            record.CdIdioma,
			LanguageProficiencyId: record.CdNivel,
		}
		languages = append(languages, language)
	}

	gocsv.SetCSVWriter(func(out io.Writer) *gocsv.SafeCSVWriter {
		writer := csv.NewWriter(out)
		writer.Comma = '\t'
		return gocsv.NewSafeCSVWriter(writer)
	})
	err = gocsv.MarshalFile(&languages, file)
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		panic(err)
	}

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