package model

import (
	"errors"
	"time"
)

// SessionLog repräsentiert einen einzelnen Satz innerhalb einer Session.
type SessionLog struct {
	ID           int64     `json:"id"`
	SessionID    int64     `json:"session_id"`
	ExerciseID   int64     `json:"exercise_id"`
	ExerciseName string    `json:"exercise_name"`
	SetNumber    int       `json:"set_number"`
	WeightKg     float64   `json:"weight_kg"`
	Reps         int       `json:"reps"`
	Note         string    `json:"note"`
	LoggedAt     time.Time `json:"logged_at"`
}

// CreateLogRequest enthält die Felder zum Loggen eines Satzes.
type CreateLogRequest struct {
	ExerciseID int64   `json:"exercise_id"`
	SetNumber  int     `json:"set_number"`
	WeightKg   float64 `json:"weight_kg"`
	Reps       int     `json:"reps"`
	Note       string  `json:"note"`
}

// Validate prüft den Request.
func (r *CreateLogRequest) Validate() error {
	if r.SetNumber < 1 {
		return errors.New("Satznummer muss ≥ 1 sein")
	}
	if r.WeightKg < 0 || r.WeightKg > 999 {
		return errors.New("Gewicht muss zwischen 0 und 999 kg liegen")
	}
	if r.Reps < 0 || r.Reps > 999 {
		return errors.New("Wiederholungen müssen zwischen 0 und 999 liegen")
	}
	return nil
}

// UpdateLogRequest enthält die Felder zum Korrigieren eines Satzes.
type UpdateLogRequest struct {
	WeightKg *float64 `json:"weight_kg"`
	Reps     *int     `json:"reps"`
	Note     *string  `json:"note"`
}

// Validate prüft den Request.
func (r *UpdateLogRequest) Validate() error {
	if r.WeightKg != nil && (*r.WeightKg < 0 || *r.WeightKg > 999) {
		return errors.New("Gewicht muss zwischen 0 und 999 kg liegen")
	}
	if r.Reps != nil && (*r.Reps < 0 || *r.Reps > 999) {
		return errors.New("Wiederholungen müssen zwischen 0 und 999 liegen")
	}
	return nil
}

// LastLogResponse enthält die letzten Werte einer Übung.
type LastLogResponse struct {
	WeightKg float64 `json:"weight_kg"`
	Reps     int     `json:"reps"`
}

// ExerciseStats enthält aggregierte Statistiken einer Übung.
type ExerciseStats struct {
	ExerciseID   int64   `json:"exercise_id"`
	ExerciseName string  `json:"exercise_name"`
	MaxWeightKg  float64 `json:"max_weight_kg"`
	TotalVolumeKg float64 `json:"total_volume_kg"`
	TotalSets    int     `json:"total_sets"`
	LastTrained  string  `json:"last_trained"`
}
