package store

import (
	"database/sql"
	"fmt"
	"krafttrainer/internal/model"
)

// ListUsers gibt alle Nutzer zurück.
func (s *Store) ListUsers() ([]model.User, error) {
	rows, err := s.db.Query(`SELECT id, name, created_at FROM users ORDER BY created_at`)
	if err != nil {
		return nil, fmt.Errorf("Nutzer abfragen: %w", err)
	}
	defer rows.Close()

	var users []model.User
	for rows.Next() {
		var u model.User
		if err := rows.Scan(&u.ID, &u.Name, &u.CreatedAt); err != nil {
			return nil, fmt.Errorf("Nutzer scannen: %w", err)
		}
		users = append(users, u)
	}
	if users == nil {
		users = []model.User{}
	}
	return users, rows.Err()
}

// CreateUser legt einen neuen Nutzer an.
func (s *Store) CreateUser(name string) (*model.User, error) {
	result, err := s.db.Exec(`INSERT INTO users (name) VALUES (?)`, name)
	if err != nil {
		return nil, fmt.Errorf("Nutzer erstellen: %w", err)
	}
	id, _ := result.LastInsertId()
	return s.getUser(id)
}

// DeleteUser löscht einen Nutzer, sofern noch mindestens ein weiterer existiert.
func (s *Store) DeleteUser(id int64) error {
	var count int
	if err := s.db.QueryRow(`SELECT COUNT(*) FROM users`).Scan(&count); err != nil {
		return fmt.Errorf("Nutzeranzahl prüfen: %w", err)
	}
	if count <= 1 {
		return fmt.Errorf("LAST_USER: letzter Nutzer kann nicht gelöscht werden")
	}

	result, err := s.db.Exec(`DELETE FROM users WHERE id = ?`, id)
	if err != nil {
		return fmt.Errorf("Nutzer löschen: %w", err)
	}
	rows, _ := result.RowsAffected()
	if rows == 0 {
		return sql.ErrNoRows
	}
	return nil
}

func (s *Store) getUser(id int64) (*model.User, error) {
	var u model.User
	err := s.db.QueryRow(`SELECT id, name, created_at FROM users WHERE id = ?`, id).
		Scan(&u.ID, &u.Name, &u.CreatedAt)
	if err == sql.ErrNoRows {
		return nil, nil
	}
	if err != nil {
		return nil, fmt.Errorf("Nutzer abfragen: %w", err)
	}
	return &u, nil
}
