package main

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

	"github.com/gocarina/gocsv"
)

type (
	JobsOld struct {
		IDVaga            int    `csv:"id_vaga"`
		IDEmpregador      int    `csv:"id_empregador"`
		IDProfissao       int    `csv:"id_profissao"`
		NRVaga            int `csv:"nr_vaga"`
		DSDescricao       string `csv:"ds_descricao"`
		NRContratado      int `csv:"nr_contratado"`
		DSReqObrigatorios string `csv:"ds_req_obrigatorios"`
		DSReqDesejaveis   string `csv:"ds_req_desejaveis"`
		DSBeneficios      string `csv:"ds_beneficios"`
		DSOutrosInfo      string `csv:"ds_outros_info"`
		CDFaixaSalarial   string `csv:"cd_faixa_salarial"`
		CDTipoContratacao string `csv:"cd_tipo_contratacao"`
		DTCadastro        string `csv:"dt_cadastro"`
		DTAlteracao       string `csv:"dt_alteracao"`
		SNConfidencial    string `csv:"sn_confidencial"`
		CDStatus          string `csv:"cd_status"`
	}
	Jobs struct {
        ID int `csv:"id"`
        CompanyID int `csv:"company_id"`
        OccupationID int `csv:"occupation_id"`
        SpotsTotal int `csv:"spots_total"`
        Description string `csv:"descripton"`
        SpotsFilled int `csv:"spots_filled"`
        RequirementsMandatory string `csv:"requirements_mandatory"`
        RequirementsOptional string `csv:"requirements_optional"`
        Benefits string `csv:"benefits"`
        MiscInfo string `csv:"misc_info"`
        SalaryRangeID string `csv:"salary_range_id"`
        ContractTypeID string `csv:"contract_type_id"`
        CreatedAt string `csv:"created_at"`
        UpdatedAt string `csv:"updated_at"`
        HideCompany string `csv:"hide_company"`
        IsHiring string `csv:"is_hiring"`
	}
)

func ExecJobs(wg *sync.WaitGroup) {
	defer wg.Done()

	records := extractJobsOld()
    createJobsCsv(records)
}

func extractJobsOld() []JobsOld {
	fmt.Println(Yellow + "Extracting jobs" + Reset)
	csvFile, err := os.Open("files/TB_SOPA_BC_EMPREGADOR_VAGA.csv")
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		return nil
	}
	defer csvFile.Close()

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

	var records []JobsOld
	if err := gocsv.UnmarshalCSV(reader, &records); err != nil {
		fmt.Println(Red + err.Error() + Reset)
		return nil
	}

	if len(records) == 0 {
		fmt.Println(Red + "No records found" + Reset)
		return nil
	}

	return records
}

func createJobsCsv(records []JobsOld) {
	file, err := os.Create(filepath.Join(basePath, "jobs.csv"))
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		return
	}
	defer file.Close()

	var jobs []*Jobs
	for _, record := range records {
		clenaedDSDescricao := replaceCharacter("\n", " ", record.DSDescricao)
		clenaedDSDescricao = replaceCharacter("\r", "", clenaedDSDescricao)
		clenaedDSReqObrigatorios := replaceCharacter("\n", " ", record.DSReqObrigatorios)
		clenaedDSReqObrigatorios = replaceCharacter("\r", "", clenaedDSReqObrigatorios)
		clenaedDSReqDesejaveis := replaceCharacter("\n", " ", record.DSReqDesejaveis)
		clenaedDSReqDesejaveis = replaceCharacter("\r", "", clenaedDSReqDesejaveis)
		clenaedDSBeneficios := replaceCharacter("\n", " ", record.DSBeneficios)
		clenaedDSBeneficios = replaceCharacter("\r", "", clenaedDSBeneficios)
		clenaedDSOutrosInfo := replaceCharacter("\n", " ", record.DSOutrosInfo)
		clenaedDSOutrosInfo = replaceCharacter("\r", "", clenaedDSOutrosInfo)

		job := &Jobs{
            ID: record.IDVaga,
            CompanyID: record.IDEmpregador,
            OccupationID: record.IDProfissao,
            SpotsTotal: record.NRVaga,
            Description: clenaedDSDescricao,
            SpotsFilled: record.NRContratado,
            RequirementsMandatory: clenaedDSReqObrigatorios,
            RequirementsOptional: clenaedDSReqDesejaveis,
            Benefits: clenaedDSBeneficios,
            MiscInfo: clenaedDSOutrosInfo,
            SalaryRangeID: record.CDFaixaSalarial,
            ContractTypeID: record.CDTipoContratacao,
            CreatedAt: record.DTCadastro,
            UpdatedAt: record.DTAlteracao,
            HideCompany: record.SNConfidencial,
            IsHiring: record.CDStatus,
        }

		jobs = append(jobs, job)
	}

	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(jobs, file)
	if err != nil {
		fmt.Println(Red + err.Error() + Reset)
		return
	}

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