package excelread

import (
	"business-engine/internal/database"
	"fmt"
	"time"
)

// EmployeeDataRow repräsentiert eine einzelne, vollständige Datenzeile aus der CSV.
type EmployeeDataRow struct {
	Personalnummer                        int     `json:"personalnummer"`
	Nachname                              string  `json:"nachname"`
	Vorname                               string  `json:"vorname"`
	Vertragsart                           string  `json:"vertragsart"`
	HatPersonenbefoerderungsschein        string  `json:"hatPersonenbefoerderungsschein"`
	HatRechtAufZuschlaege                 string  `json:"hatRechtAufZuschlaege"`
	Vertragsstart                         string  `json:"vertragsstart"`
	VertragstageProWoche                  float64 `json:"vertragstageProWoche"`
	VertragsstundenProWoche               float64 `json:"vertragsstundenProWoche"`
	VertragsstundenMax                    string  `json:"vertragsstundenMax"`
	UrlaubstageProJahr                    float64 `json:"urlaubstageProJahr"`
	GearbeiteteTage                       float64 `json:"gearbeiteteTage"`
	GearbeiteteStunden                    float64 `json:"gearbeiteteStunden"`
	GenommeneUrlaubstage                  float64 `json:"genommeneUrlaubstage"`
	GenommeneUrlaubsstunden               float64 `json:"genommeneUrlaubsstunden"`
	Krankheitstage                        float64 `json:"krankheitstage"`
	Krankheitsstunden                     float64 `json:"krankheitsstunden"`
	KrankengeldTage                       float64 `json:"krankengeldTage"`
	KrankengeldStunden                    float64 `json:"krankengeldStunden"`
	UnbezahlterUrlaubTage                 float64 `json:"unbezahlterUrlaubTage"`
	UnbezahlterUrlaubStunden              float64 `json:"unbezahlterUrlaubStunden"`
	EinbehaltungGesamtTage                float64 `json:"einbehaltungGesamtTage"`
	EinbehaltungGesamtStunden             float64 `json:"einbehaltungGesamtStunden"`
	IstSollGesamtTage                     float64 `json:"istSollGesamtTage"`
	IstSollGesamtStunden                  float64 `json:"istSollGesamtStunden"`
	IstSollVertragsTage                   float64 `json:"istSollVertragsTage"`
	IstSollVertragsStunden                float64 `json:"istSollVertragsStunden"`
	IstSollPlusMinusStunden               float64 `json:"istSollPlusMinusStunden"`
	BerechnungMehrstunden                 float64 `json:"berechnungMehrstunden"`
	BerechnungUeberstunden                float64 `json:"berechnungUeberstunden"`
	BerechnungAnzahlPSchein               float64 `json:"berechnungAnzahlPSchein"`
	BerechnungKrankOhneAUTage             float64 `json:"berechnungKrankOhneAUTage"`
	BerechnungKrankOhneAUStunden          float64 `json:"berechnungKrankOhneAUStunden"`
	BerechnungNachtzuschlag25Tage         float64 `json:"berechnungNachtzuschlag25Tage"`
	BerechnungNachtzuschlag25Stunden      float64 `json:"berechnungNachtzuschlag25Stunden"`
	BerechnungNachtzuschlag40Tage         float64 `json:"berechnungNachtzuschlag40Tage"`
	BerechnungNachtzuschlag40Stunden      float64 `json:"berechnungNachtzuschlag40Stunden"`
	BerechnungSonntagszuschlag50Tage      float64 `json:"berechnungSonntagszuschlag50Tage"`
	BerechnungSonntagszuschlag50Stunden   float64 `json:"berechnungSonntagszuschlag50Stunden"`
	BerechnungVerpflegungspauschale14Tage float64 `json:"berechnungVerpflegungspauschale14Tage"`
	BerechnungSamstagszuschlag15Tage      float64 `json:"berechnungSamstagszuschlag15Tage"`
	BerechnungSamstagszuschlag15Stunden   float64 `json:"berechnungSamstagszuschlag15Stunden"`
	BerechnungZeitausgleichStart          float64 `json:"berechnungZeitausgleichStart"`
	BerechnungZeitausgleichPlusMinus      float64 `json:"berechnungZeitausgleichPlusMinus"`
	BerechnungZeitausgleichAenderungen    float64 `json:"berechnungZeitausgleichAenderungen"`
	BerechnungZeitausgleichAuszahlen      float64 `json:"berechnungZeitausgleichAuszahlen"`
	BerechnungZeitausgleichJetzt          float64 `json:"berechnungZeitausgleichJetzt"`
	SaldenUrlaubStart                     float64 `json:"saldenUrlaubStart"`
	SaldenUrlaubAbbau                     float64 `json:"saldenUrlaubAbbau"`
	SaldenUrlaubKorrektur                 float64 `json:"saldenUrlaubKorrektur"`
	SaldenUrlaubJetzt                     float64 `json:"saldenUrlaubJetzt"`
	SaldenMehrstunden                     float64 `json:"saldenMehrstunden"`
	SaldenUeberstunden                    float64 `json:"saldenUeberstunden"`
	AuszahlenFahrtkostenKm                float64 `json:"auszahlenFahrtkostenKm"`
	AuszahlenVerpflegungspauschaleTage    float64 `json:"auszahlenVerpflegungspauschaleTage"`
	AuszahlenAnzahlPSchein                float64 `json:"auszahlenAnzahlPSchein"`
	AuszahlenZuschlag25Stunden            float64 `json:"auszahlenZuschlag25Stunden"`
	AuszahlenZuschlag40Stunden            float64 `json:"auszahlenZuschlag40Stunden"`
	AuszahlenZuschlag50Stunden            float64 `json:"auszahlenZuschlag50Stunden"`
	AuszahlenZuschlag14Stunden            float64 `json:"auszahlenZuschlag14Stunden"`
	AuszahlenZuschlag15Stunden            float64 `json:"auszahlenZuschlag15Stunden"`
}

type PayrollInputData struct {
	ContractSalaryHour float64
	Tourengeld         float64
	Worktimes          []database.WorkTime
	Plannedtimes       []database.ListPlannedTimesForEmployeeInPeriodRow
}

func NewPayrollInputData(salaryHour float64, tourengeld float64, worktimes []database.WorkTime, plannedtimes []database.ListPlannedTimesForEmployeeInPeriodRow) PayrollInputData {
	return PayrollInputData{
		ContractSalaryHour: salaryHour,
		Tourengeld:         tourengeld,
		Worktimes:          worktimes,
		Plannedtimes:       plannedtimes,
	}
}

type PayrollStatement struct {
	Nachname                     string  `json:"nachname" csv:"Nachname"`
	Vorname                      string  `json:"vorname" csv:"Vorname"`
	Verpflegungspauschale        float64 `json:"verpflegungspauschale" csv:"Verpflegungspauschale"`
	VertragStundenlohn           float64 `json:"stundenlohn" csv:"Vertr. Stundenlohn"`
	Vertragsstunden              float64 `json:"vertragsstunden" csv:"Arbeitsstunden lt. Vertrag"`
	GearbeiteteStunden           float64 `json:"gearbeiteteStunden" csv:"Gearbeitet Stunden"`
	GearbeiteteTage              float64 `json:"gearbeiteteTage" csv:"Gearbeitet Tage"`
	PuenktlichkeitspraemieAnzahl float64 `json:"puenktlichkeitspraemieAnzahl" csv:"Pünktlichkeitsprämie anzahl"`
	Krankheitstage               float64 `json:"krankheitstage" csv:"Krankheitstage x 8 Stunden"`
	Ueberstunden                 float64 `json:"ueberstunden" csv:"davon Überstunden"`
	Tourengeld                   float64 `json:"tourengeld" csv:"Tourengeld Anzahl"`
	TourengeldBonus              float64 `json:"tourengeldBonus" csv:"Tourengeld-Bonus (Platz 1-3, EUR)"`
	GesundheitsbonusAbzug        string  `json:"gesundheitsbonusAbzug" csv:"Gesundheitsbonus abzuziehen? (ja/nein)"`
	Urlaubsgeld                  float64 `json:"urlaubsgeld" csv:"Urlaubsgeld (44 EUR pro tag)"`
	PScheinZulage                float64 `json:"pScheinZulage" csv:"P-schein Zulage"`
	Wochenendzuschlag15          float64 `json:"wochenendzuschlag15" csv:"Wochenendzuschlag 15%"`
	Sonntagszuschlag50           float64 `json:"sonntagszuschlag50" csv:"Sonntagszuschlag 50%"`
	Feiertagszuschlag125         float64 `json:"feiertagszuschlag125" csv:"Feiertagszuschlag 125%"`
	Nachtzuschlag25              float64 `json:"nachtzuschlag25" csv:"Nachtzuschlag 25%"`
	Nachtzuschlag40              float64 `json:"nachtzuschlag40" csv:"Nachtzuschlag 40%"`
}

type EmployeeOnTime struct {
	EmployeeId  string    `csv:"EmployeeId"`
	WorkTime    time.Time `csv:"Arbeitszeit"`
	PlannedTime time.Time `csv:"Schichtplanung"`
	IsOnTime    bool      `csv:"Pünktlich?"`
}

func NewEmployeeOnTime(employeeId string, worktime, plannedtime time.Time) EmployeeOnTime {
	loc, err := time.LoadLocation("Europe/Berlin")
	if err != nil {
		fmt.Println("Fehler beim Laden der Zeitzone:", err)
	}
	return EmployeeOnTime{
		EmployeeId:  employeeId,
		WorkTime:    worktime.In(loc),
		PlannedTime: plannedtime.In(loc),
		IsOnTime:    worktime.Before(plannedtime) || worktime == plannedtime,
	}
}
