package excelread

import (
	"encoding/csv"
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"
)

// mapRowToStruct konvertiert eine einzelne CSV-Zeile (als []string)
// in die EmployeeDataRow-Struct.
func mapRowToStruct(row []string) EmployeeDataRow {
	data := EmployeeDataRow{}

	data.Personalnummer = parseInt(row[0])
	data.Nachname = strings.TrimSpace(row[1])
	data.Vorname = strings.TrimSpace(row[2])
	data.Vertragsart = strings.TrimSpace(row[3])
	data.HatPersonenbefoerderungsschein = strings.TrimSpace(row[4])
	data.HatRechtAufZuschlaege = strings.TrimSpace(row[5])
	data.Vertragsstart = strings.TrimSpace(row[6])
	data.VertragstageProWoche = parseFloat(row[7])
	data.VertragsstundenProWoche = parseFloat(row[8])
	data.VertragsstundenMax = strings.TrimSpace(row[9])
	data.UrlaubstageProJahr = parseFloat(row[10])
	data.GearbeiteteTage = parseFloat(row[11])
	data.GearbeiteteStunden = parseFloat(row[12])
	data.GenommeneUrlaubstage = parseFloat(row[13])
	data.GenommeneUrlaubsstunden = parseFloat(row[14])
	data.Krankheitstage = parseFloat(row[15])
	data.Krankheitsstunden = parseFloat(row[16])

	// data.KrankengeldTage = parseFloat(row[17])
	// data.KrankengeldStunden = parseFloat(row[18])
	// data.UnbezahlterUrlaubTage = parseFloat(row[19])
	// data.UnbezahlterUrlaubStunden = parseFloat(row[20])

	data.IstSollGesamtTage = parseFloat(row[17])
	data.IstSollGesamtStunden = parseFloat(row[18])
	data.IstSollVertragsTage = parseFloat(row[19])
	data.IstSollVertragsStunden = parseFloat(row[20])
	data.IstSollPlusMinusStunden = parseFloat(row[21])
	data.BerechnungMehrstunden = parseFloat(row[22])
	data.BerechnungUeberstunden = parseFloat(row[23])
	data.BerechnungAnzahlPSchein = parseFloat(row[24])
	data.BerechnungKrankOhneAUTage = parseFloat(row[25])
	data.BerechnungKrankOhneAUStunden = parseFloat(row[26])
	data.BerechnungNachtzuschlag25Tage = parseFloat(row[27])
	data.BerechnungNachtzuschlag25Stunden = parseFloat(row[28])
	data.BerechnungNachtzuschlag40Tage = parseFloat(row[29])
	data.BerechnungNachtzuschlag40Stunden = parseFloat(row[30])
	data.BerechnungSonntagszuschlag50Tage = parseFloat(row[31])
	data.BerechnungSonntagszuschlag50Stunden = parseFloat(row[32])
	data.BerechnungVerpflegungspauschale14Tage = parseFloat(row[33])
	data.BerechnungSamstagszuschlag15Tage = parseFloat(row[34])
	data.BerechnungSamstagszuschlag15Stunden = parseFloat(row[35])
	data.BerechnungZeitausgleichStart = parseFloat(row[36])
	data.BerechnungZeitausgleichPlusMinus = parseFloat(row[37])
	data.BerechnungZeitausgleichAenderungen = parseFloat(row[38])
	data.BerechnungZeitausgleichAuszahlen = parseFloat(row[39])
	data.BerechnungZeitausgleichJetzt = parseFloat(row[40])
	data.SaldenUrlaubStart = parseFloat(row[41])
	data.SaldenUrlaubAbbau = parseFloat(row[42])

	data.SaldenUrlaubKorrektur = parseFloat(row[43])

	data.SaldenUrlaubJetzt = parseFloat(row[44])
	data.SaldenMehrstunden = parseFloat(row[45])
	data.SaldenUeberstunden = parseFloat(row[46])
	data.AuszahlenFahrtkostenKm = parseFloat(row[47])
	data.AuszahlenVerpflegungspauschaleTage = parseFloat(row[48])
	data.AuszahlenAnzahlPSchein = parseFloat(row[49])
	data.AuszahlenZuschlag25Stunden = parseFloat(row[50])
	data.AuszahlenZuschlag40Stunden = parseFloat(row[51])
	data.AuszahlenZuschlag50Stunden = parseFloat(row[52])
	data.AuszahlenZuschlag14Stunden = parseFloat(row[53])
	data.AuszahlenZuschlag15Stunden = parseFloat(row[54])
	return data
}

// map from: July 2025
// func mapRowToStruct(row []string) EmployeeDataRow {
// 	data := EmployeeDataRow{}

// 	data.Personalnummer = parseInt(row[0])
// 	data.Nachname = strings.TrimSpace(row[1])
// 	data.Vorname = strings.TrimSpace(row[2])
// 	data.Vertragsart = strings.TrimSpace(row[3])
// 	data.HatPersonenbefoerderungsschein = strings.TrimSpace(row[4])
// 	data.HatRechtAufZuschlaege = strings.TrimSpace(row[5])
// 	data.Vertragsstart = strings.TrimSpace(row[6])
// 	data.VertragstageProWoche = parseFloat(row[7])
// 	data.VertragsstundenProWoche = parseFloat(row[8])
// 	data.VertragsstundenMax = strings.TrimSpace(row[9])
// 	data.UrlaubstageProJahr = parseFloat(row[10])
// 	data.GearbeiteteTage = parseFloat(row[11])
// 	data.GearbeiteteStunden = parseFloat(row[12])
// 	data.GenommeneUrlaubstage = parseFloat(row[13])
// 	data.GenommeneUrlaubsstunden = parseFloat(row[14])
// 	data.Krankheitstage = parseFloat(row[15])
// 	data.Krankheitsstunden = parseFloat(row[16])
// 	data.KrankengeldTage = parseFloat(row[17])
// 	data.KrankengeldStunden = parseFloat(row[18])
// 	data.UnbezahlterUrlaubTage = parseFloat(row[19])
// 	data.UnbezahlterUrlaubStunden = parseFloat(row[20])
// 	data.IstSollGesamtTage = parseFloat(row[21])
// 	data.IstSollGesamtStunden = parseFloat(row[22])
// 	data.IstSollVertragsTage = parseFloat(row[23])
// 	data.IstSollVertragsStunden = parseFloat(row[24])
// 	data.IstSollPlusMinusStunden = parseFloat(row[25])
// 	data.BerechnungMehrstunden = parseFloat(row[26])
// 	data.BerechnungUeberstunden = parseFloat(row[27])
// 	data.BerechnungAnzahlPSchein = parseFloat(row[28])
// 	data.BerechnungKrankOhneAUTage = parseFloat(row[29])
// 	data.BerechnungKrankOhneAUStunden = parseFloat(row[30])
// 	data.BerechnungNachtzuschlag25Tage = parseFloat(row[31])
// 	data.BerechnungNachtzuschlag25Stunden = parseFloat(row[32])
// 	data.BerechnungNachtzuschlag40Tage = parseFloat(row[33])
// 	data.BerechnungNachtzuschlag40Stunden = parseFloat(row[34])
// 	data.BerechnungSonntagszuschlag50Tage = parseFloat(row[35])
// 	data.BerechnungSonntagszuschlag50Stunden = parseFloat(row[36])
// 	data.BerechnungVerpflegungspauschale14Tage = parseFloat(row[37])
// 	data.BerechnungSamstagszuschlag15Tage = parseFloat(row[38])
// 	data.BerechnungSamstagszuschlag15Stunden = parseFloat(row[39])
// 	data.BerechnungZeitausgleichStart = parseFloat(row[40])
// 	data.BerechnungZeitausgleichPlusMinus = parseFloat(row[41])
// 	data.BerechnungZeitausgleichAenderungen = parseFloat(row[42])
// 	data.BerechnungZeitausgleichAuszahlen = parseFloat(row[43])
// 	data.BerechnungZeitausgleichJetzt = parseFloat(row[44])
// 	data.SaldenUrlaubStart = parseFloat(row[45])
// 	data.SaldenUrlaubAbbau = parseFloat(row[46])
// 	data.SaldenUrlaubJetzt = parseFloat(row[47])
// 	data.SaldenMehrstunden = parseFloat(row[48])
// 	data.SaldenUeberstunden = parseFloat(row[49])
// 	data.AuszahlenFahrtkostenKm = parseFloat(row[50])
// 	data.AuszahlenVerpflegungspauschaleTage = parseFloat(row[51])
// 	data.AuszahlenAnzahlPSchein = parseFloat(row[52])
// 	data.AuszahlenZuschlag25Stunden = parseFloat(row[53])
// 	data.AuszahlenZuschlag40Stunden = parseFloat(row[54])
// 	data.AuszahlenZuschlag50Stunden = parseFloat(row[55])
// 	data.AuszahlenZuschlag14Stunden = parseFloat(row[56])
// 	data.AuszahlenZuschlag15Stunden = parseFloat(row[57])
// 	return data
// }

func ReadEmployeeData() []EmployeeDataRow {
	content, err := os.ReadFile("daten.csv")
	if err != nil {
		log.Fatalf("Fehler beim Lesen der Datei: %v", err)
	}

	reader := csv.NewReader(strings.NewReader(string(content)))
	reader.Comma = ';'
	reader.FieldsPerRecord = -1

	records, err := reader.ReadAll()
	if err != nil {
		log.Fatalf("Fehler beim Parsen der CSV: %v", err)
	}

	if len(records) < 5 {
		log.Fatal("Die CSV-Datei hat nicht genügend Zeilen.")
	}
	dataRows := records[3 : len(records)-1]

	var employees []EmployeeDataRow

	for i, row := range dataRows {
		fmt.Printf("%v", len(row))
		if row[1] != "Shahrasebi" {
			employee := mapRowToStruct(row)
			employees = append(employees, employee)
			fmt.Printf("Zeile %d geladen: %s, %s\n", i+4, employee.Nachname, employee.Vorname)
		}
	}

	fmt.Printf("\n--- Insgesamt %d Mitarbeiterdatensätze erfolgreich geladen. ---\n", len(employees))

	return employees
}

// Helfer-Funktion, um Strings mit Komma als Dezimaltrennzeichen in float64 umzuwandeln.
func parseFloat(s string) float64 {
	s = strings.TrimSpace(s)
	if s == "" {
		return 0.0
	}
	// Ersetze das Komma durch einen Punkt für die Standard-Konvertierung
	s = strings.Replace(s, ",", ".", 1)
	val, err := strconv.ParseFloat(s, 64)
	if err != nil {
		return 0.0 // Bei Fehler einfach 0 zurückgeben
	}
	return val
}

// Helfer-Funktion, um einen String in einen Integer umzuwandeln.
func parseInt(s string) int {
	s = strings.TrimSpace(s)
	if s == "" {
		return 0
	}
	val, err := strconv.Atoi(s)
	if err != nil {
		return 0
	}
	return val
}
