package resources

import (
	"fmt"
	"strconv"
	"strings"
	"time"

	"git.bissendorf.co/bissendorf/unifood/m/v2/model/external/stwbremen"
	"git.bissendorf.co/bissendorf/unifood/m/v2/util"
)

func MealFromDTO(meal stwbremen.Meal) (*Meal, error) {
	date, err := time.Parse(time.DateOnly, meal.Date)
	if err != nil {
		return nil, fmt.Errorf("unable to parse meal date: %w", err)
	}

	id, _ := strings.CutPrefix(meal.ID, "meals/")

	return &Meal{
		Title:        meal.Title,
		RestaurantID: meal.Location,
		ID:           id,
		Date:         date,
		Tags:         strings.Split(strings.Replace(meal.Tags, " ", "", -1), ","),
		Counter:      meal.Counter,
		Prices: util.Map(meal.Prices, func(i *stwbremen.Price) (string, float32) {
			p, err := strconv.ParseFloat(strings.Trim(i.Price, " "), 32)
			if err != nil {
				p = 0
			}
			return i.Label, float32(p)
		}),
		Ingredients: util.Select(util.Transform(meal.Ingredients, func(i *stwbremen.Ingredient) ingredient {
			return ingredient{
				Name:        i.Label,
				Additionals: i.Additionals,
			}
		}), func(i *ingredient) bool { return i.Name != "" }),
	}, nil
}

const ResourceMeal = "meal"

type Meal struct {
	Title        string
	ID           string
	RestaurantID string
	Ingredients  []ingredient
	Prices       map[string]float32
	Date         time.Time
	Counter      string
	Tags         []string
}

type ingredient struct {
	Name        string
	Additionals []string
}

func (d *Meal) Kind() string     { return ResourceMeal }
func (d *Meal) ItemName() string { return d.ID }

// Table output
func (d *Meal) ColumnNames() []string {
	return []string{"Date", "Restaurant", "Title", "Counter", "Price"}
}
func (d *Meal) Columns() []any {
	return []any{d.Date.Format(time.DateOnly), d.RestaurantID, d.Title, d.Counter, d.Prices["Studierende"]}
}
