package dev.ulfrx.recipe.ui.screens.recipedetail

import dev.ulfrx.recipe.ui.components.recipe.MealSlot
import dev.ulfrx.recipe.ui.components.recipe.RecipeUi
import dev.ulfrx.recipe.ui.components.recipe.RecipeIngredientOptionUi
import dev.ulfrx.recipe.ui.components.recipe.RecipeIngredientSlotUi
import dev.ulfrx.recipe.ui.components.recipe.RecipeNutritionUi

private val LunchOrDinner = listOf(MealSlot.Lunch, MealSlot.Dinner)
private val BreakfastOrSnack = listOf(MealSlot.Breakfast, MealSlot.Snack)
private val LightMeal = listOf(MealSlot.Lunch, MealSlot.Dinner, MealSlot.Supper)

internal val sampleRecipes: Map<String, RecipeUi> =
    listOf(
        RecipeUi(
            id = "rcp_nalesniki",
            title = "Naleśniki z twarogiem",
            cookingMinutes = 25,
            nutrition = RecipeNutritionUi(kcal = 320, protein = 18, fat = 9, carbs = 42),
            allowedSlots = listOf(MealSlot.Breakfast, MealSlot.Supper, MealSlot.Snack),
            ingredients =
                listOf(
                    slot("Mąka pszenna", 60.0, "g"),
                    slot("Mleko", 125.0, "ml"),
                    slot("Jajka", 1.0, "szt."),
                    slot(
                        "Twaróg półtłusty",
                        100.0,
                        "g",
                        alt("Twaróg chudy", 100.0, "g"),
                        alt("Serek wiejski", 120.0, "g"),
                    ),
                    slot("Miód", 10.0, "g", alt("Syrop klonowy", 12.0, "g")),
                    slot("Olej do smażenia", 5.0, "ml"),
                ),
            steps =
                listOf(
                    "Zmiksuj mąkę, mleko, jajko i szczyptę soli na gładkie ciasto. Odstaw na 10 minut.",
                    "Rozgrzej odrobinę oleju na patelni i smaż cienkie naleśniki z obu stron na złoto.",
                    "Twaróg rozetrzyj z miodem na gładką masę.",
                    "Nałóż masę twarogową na naleśniki, zwiń i podawaj.",
                ),
        ),
        RecipeUi(
            id = "rcp_owsianka",
            title = "Owsianka z owocami i orzechami",
            cookingMinutes = 10,
            nutrition = RecipeNutritionUi(kcal = 280, protein = 9, fat = 11, carbs = 38),
            allowedSlots = BreakfastOrSnack,
            ingredients =
                listOf(
                    slot("Płatki owsiane", 50.0, "g"),
                    slot(
                        "Mleko",
                        200.0,
                        "ml",
                        alt("Napój owsiany", 200.0, "ml"),
                        alt("Napój migdałowy", 200.0, "ml"),
                    ),
                    slot("Banan", 0.5, "szt."),
                    slot(
                        "Borówki",
                        40.0,
                        "g",
                        alt("Maliny", 40.0, "g"),
                        alt("Truskawki", 50.0, "g"),
                    ),
                    slot(
                        "Orzechy włoskie",
                        15.0,
                        "g",
                        alt("Migdały", 15.0, "g"),
                        alt("Orzechy laskowe", 15.0, "g"),
                    ),
                    slot("Miód", 10.0, "g"),
                ),
            steps =
                listOf(
                    "Płatki owsiane zalej mlekiem i gotuj na małym ogniu 4–5 minut, mieszając.",
                    "Przełóż owsiankę do miski.",
                    "Ułóż na wierzchu pokrojonego banana, borówki i posiekane orzechy.",
                    "Polej miodem i podawaj.",
                ),
        ),
        RecipeUi(
            id = "rcp_spaghetti",
            title = "Spaghetti bolognese",
            cookingMinutes = 40,
            nutrition = RecipeNutritionUi(kcal = 540, protein = 28, fat = 18, carbs = 65),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Makaron spaghetti", 100.0, "g"),
                    slot(
                        "Mięso mielone wołowe",
                        120.0,
                        "g",
                        alt("Mięso mielone z indyka", 120.0, "g"),
                        alt("Soczewica czerwona", 60.0, "g"),
                    ),
                    slot("Passata pomidorowa", 150.0, "ml"),
                    slot("Cebula", 0.5, "szt."),
                    slot("Czosnek", 1.0, "ząbek"),
                    slot("Oliwa", 10.0, "ml"),
                ),
            steps =
                listOf(
                    "Makaron ugotuj al dente w osolonej wodzie wg opakowania.",
                    "Na oliwie zeszklij posiekaną cebulę i czosnek, dodaj mięso i smaż do zrumienienia.",
                    "Wlej passatę, dopraw solą, pieprzem i ziołami. Duś 15 minut.",
                    "Wymieszaj sos z odsączonym makaronem i podawaj.",
                ),
        ),
        RecipeUi(
            id = "rcp_pierogi",
            title = "Pierogi ruskie",
            cookingMinutes = 90,
            nutrition = RecipeNutritionUi(kcal = 460, protein = 14, fat = 14, carbs = 68),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Mąka pszenna", 120.0, "g"),
                    slot("Woda", 60.0, "ml"),
                    slot("Ziemniaki", 150.0, "g"),
                    slot("Twaróg półtłusty", 80.0, "g"),
                    slot("Cebula", 0.5, "szt."),
                    slot("Masło", 10.0, "g"),
                ),
            steps =
                listOf(
                    "Z mąki, ciepłej wody i szczypty soli zagnieć gładkie ciasto. Odstaw pod ściereczką.",
                    "Ziemniaki ugotuj i ugnieć z twarogiem. Dodaj zeszkloną cebulę, dopraw solą i pieprzem.",
                    "Rozwałkuj ciasto, wykrawaj krążki, nakładaj farsz i zlepiaj pierogi.",
                    "Gotuj partiami w osolonej wodzie 3–4 minuty od wypłynięcia.",
                    "Podawaj okraszone masłem i podsmażoną cebulą.",
                ),
        ),
        RecipeUi(
            id = "rcp_kanapka_awokado",
            title = "Kanapka z awokado i jajkiem",
            cookingMinutes = 5,
            nutrition = RecipeNutritionUi(kcal = 210, protein = 9, fat = 13, carbs = 16),
            allowedSlots = listOf(MealSlot.Breakfast, MealSlot.Lunch, MealSlot.Supper, MealSlot.Snack),
            ingredients =
                listOf(
                    slot("Pieczywo razowe", 1.0, "kromka"),
                    slot("Awokado", 0.5, "szt."),
                    slot("Jajko", 1.0, "szt."),
                    slot("Sok z cytryny", 5.0, "ml"),
                    slot("Szczypiorek", 5.0, "g"),
                ),
            steps =
                listOf(
                    "Jajko ugotuj na twardo (ok. 9 minut), ostudź i obierz.",
                    "Awokado rozgnieć widelcem z sokiem z cytryny, solą i pieprzem.",
                    "Posmaruj kromkę pastą z awokado.",
                    "Ułóż plastry jajka i posyp szczypiorkiem.",
                ),
        ),
        RecipeUi(
            id = "rcp_schabowy",
            title = "Schabowy z ziemniakami",
            cookingMinutes = 60,
            nutrition = RecipeNutritionUi(kcal = 720, protein = 38, fat = 34, carbs = 62),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Schab", 150.0, "g"),
                    slot("Jajko", 1.0, "szt."),
                    slot("Bułka tarta", 40.0, "g"),
                    slot("Mąka pszenna", 20.0, "g"),
                    slot("Ziemniaki", 300.0, "g"),
                    slot("Olej do smażenia", 30.0, "ml"),
                ),
            steps =
                listOf(
                    "Ziemniaki obierz i ugotuj w osolonej wodzie.",
                    "Schab rozbij na cienkie kotlety, dopraw solą i pieprzem.",
                    "Panieruj kolejno w mące, rozkłóconym jajku i bułce tartej.",
                    "Smaż na rozgrzanym oleju z obu stron na złoto.",
                    "Podawaj z ziemniakami i ulubioną surówką.",
                ),
        ),
        RecipeUi(
            id = "rcp_salatka_grecka",
            title = "Sałatka grecka",
            cookingMinutes = 15,
            nutrition = RecipeNutritionUi(kcal = 310, protein = 9, fat = 26, carbs = 12),
            allowedSlots = LightMeal,
            ingredients =
                listOf(
                    slot("Pomidory", 150.0, "g"),
                    slot("Ogórek", 0.5, "szt."),
                    slot("Papryka czerwona", 0.5, "szt."),
                    slot("Ser feta", 60.0, "g", alt("Ser sałatkowy", 60.0, "g")),
                    slot("Oliwki czarne", 30.0, "g"),
                    slot("Oliwa", 15.0, "ml"),
                ),
            steps =
                listOf(
                    "Pomidory, ogórka i paprykę pokrój w grubą kostkę.",
                    "Przełóż warzywa do miski, dodaj oliwki.",
                    "Pokrusz fetę na wierzch.",
                    "Skrop oliwą, dopraw oregano i pieprzem. Delikatnie wymieszaj.",
                ),
        ),
        RecipeUi(
            id = "rcp_pomidorowa",
            title = "Zupa pomidorowa z ryżem",
            cookingMinutes = 35,
            nutrition = RecipeNutritionUi(kcal = 240, protein = 7, fat = 6, carbs = 39),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Passata pomidorowa", 200.0, "ml"),
                    slot("Bulion warzywny", 400.0, "ml"),
                    slot("Ryż", 40.0, "g"),
                    slot("Marchewka", 1.0, "szt."),
                    slot("Śmietana 18%", 20.0, "ml"),
                ),
            steps =
                listOf(
                    "Ryż ugotuj osobno do miękkości.",
                    "W garnku zagotuj bulion ze startą marchewką, gotuj 10 minut.",
                    "Wlej passatę i gotuj kolejne 10 minut. Dopraw solą i cukrem.",
                    "Zahartuj śmietanę i wmieszaj do zupy. Podawaj z ryżem.",
                ),
        ),
        RecipeUi(
            id = "rcp_kurczak_curry",
            title = "Kurczak curry z ryżem basmati",
            cookingMinutes = 45,
            nutrition = RecipeNutritionUi(kcal = 580, protein = 34, fat = 18, carbs = 70),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Pierś z kurczaka", 150.0, "g"),
                    slot("Ryż basmati", 80.0, "g"),
                    slot("Mleko kokosowe", 120.0, "ml", alt("Śmietanka 18%", 120.0, "ml")),
                    slot("Pasta curry", 20.0, "g"),
                    slot("Cebula", 0.5, "szt."),
                    slot("Olej", 10.0, "ml"),
                ),
            steps =
                listOf(
                    "Ryż basmati ugotuj wg opakowania.",
                    "Kurczaka pokrój w kostkę i obsmaż na oleju z posiekaną cebulą.",
                    "Dodaj pastę curry, smaż minutę, wlej mleko kokosowe.",
                    "Duś 12–15 minut do zgęstnienia sosu. Dopraw solą.",
                    "Podawaj z ryżem basmati.",
                ),
        ),
        RecipeUi(
            id = "rcp_jajecznica",
            title = "Jajecznica na maśle ze szczypiorkiem",
            cookingMinutes = 8,
            nutrition = RecipeNutritionUi(kcal = 290, protein = 19, fat = 22, carbs = 3),
            allowedSlots = listOf(MealSlot.Breakfast, MealSlot.Supper, MealSlot.Snack),
            ingredients =
                listOf(
                    slot("Jajka", 3.0, "szt."),
                    slot("Masło", 10.0, "g"),
                    slot("Szczypiorek", 10.0, "g"),
                ),
            steps =
                listOf(
                    "Rozpuść masło na patelni na małym ogniu.",
                    "Wbij jajka i smaż, delikatnie mieszając, do ścięcia.",
                    "Dopraw solą i pieprzem.",
                    "Posyp posiekanym szczypiorkiem i podawaj.",
                ),
        ),
        RecipeUi(
            id = "rcp_risotto",
            title = "Risotto z grzybami leśnymi",
            cookingMinutes = 35,
            nutrition = RecipeNutritionUi(kcal = 470, protein = 12, fat = 16, carbs = 66),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Ryż arborio", 80.0, "g"),
                    slot("Grzyby leśne", 100.0, "g"),
                    slot("Bulion warzywny", 350.0, "ml"),
                    slot("Cebula", 0.5, "szt."),
                    slot("Parmezan", 20.0, "g"),
                    slot("Masło", 15.0, "g"),
                ),
            steps =
                listOf(
                    "Na maśle zeszklij posiekaną cebulę, dodaj grzyby i podsmaż.",
                    "Wsyp ryż i smaż minutę, aż stanie się szklisty.",
                    "Dolewaj ciepły bulion po chochli, mieszając, aż ryż go wchłonie.",
                    "Gdy ryż jest al dente, wmieszaj parmezan i masło. Dopraw i podawaj.",
                ),
        ),
        RecipeUi(
            id = "rcp_tortilla",
            title = "Tortilla z kurczakiem i warzywami",
            cookingMinutes = 20,
            nutrition = RecipeNutritionUi(kcal = 430, protein = 26, fat = 14, carbs = 48),
            allowedSlots = listOf(MealSlot.Lunch, MealSlot.Dinner, MealSlot.Supper),
            ingredients =
                listOf(
                    slot("Tortilla pszenna", 1.0, "szt."),
                    slot("Pierś z kurczaka", 120.0, "g"),
                    slot("Papryka", 0.5, "szt."),
                    slot("Sałata", 30.0, "g"),
                    slot("Sos jogurtowy", 30.0, "g"),
                    slot("Olej", 5.0, "ml"),
                ),
            steps =
                listOf(
                    "Kurczaka pokrój w paski, dopraw i obsmaż na oleju.",
                    "Paprykę pokrój w cienkie paski.",
                    "Tortillę podgrzej na suchej patelni.",
                    "Wyłóż sałatę, kurczaka i paprykę, polej sosem i zawiń.",
                ),
        ),
        RecipeUi(
            id = "rcp_smoothie",
            title = "Smoothie bananowo-szpinakowe",
            cookingMinutes = 5,
            nutrition = RecipeNutritionUi(kcal = 180, protein = 6, fat = 3, carbs = 33),
            allowedSlots = BreakfastOrSnack,
            ingredients =
                listOf(
                    slot("Banan", 1.0, "szt."),
                    slot("Szpinak świeży", 30.0, "g"),
                    slot(
                        "Jogurt naturalny",
                        100.0,
                        "g",
                        alt("Skyr", 100.0, "g"),
                        alt("Kefir", 120.0, "g"),
                    ),
                    slot("Mleko", 100.0, "ml", alt("Napój owsiany", 100.0, "ml")),
                ),
            steps =
                listOf(
                    "Wszystkie składniki umieść w blenderze.",
                    "Miksuj do uzyskania gładkiej konsystencji.",
                    "Przelej do szklanki i podawaj od razu.",
                ),
        ),
        RecipeUi(
            id = "rcp_losos",
            title = "Łosoś pieczony z brokułami",
            cookingMinutes = 30,
            nutrition = RecipeNutritionUi(kcal = 510, protein = 38, fat = 32, carbs = 12),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Filet z łososia", 150.0, "g"),
                    slot("Brokuł", 200.0, "g"),
                    slot("Oliwa", 15.0, "ml"),
                    slot("Cytryna", 0.5, "szt."),
                    slot("Czosnek", 1.0, "ząbek"),
                ),
            steps =
                listOf(
                    "Piekarnik nagrzej do 200°C.",
                    "Łososia skrop oliwą i sokiem z cytryny, dopraw solą i pieprzem.",
                    "Brokuł podziel na różyczki, wymieszaj z oliwą i czosnkiem.",
                    "Piecz łososia i brokuły na blasze ok. 15–18 minut.",
                ),
        ),
        RecipeUi(
            id = "rcp_nadziewane_papryki",
            title = "Papryki nadziewane kaszą i warzywami",
            cookingMinutes = 55,
            nutrition = RecipeNutritionUi(kcal = 390, protein = 11, fat = 12, carbs = 58),
            allowedSlots = LunchOrDinner,
            ingredients =
                listOf(
                    slot("Papryka", 2.0, "szt."),
                    slot("Kasza jaglana", 60.0, "g"),
                    slot("Cukinia", 80.0, "g"),
                    slot("Passata pomidorowa", 100.0, "ml"),
                    slot("Cebula", 0.5, "szt."),
                    slot("Oliwa", 10.0, "ml"),
                ),
            steps =
                listOf(
                    "Kaszę jaglaną ugotuj do miękkości.",
                    "Na oliwie podsmaż cebulę i pokrojoną cukinię.",
                    "Wymieszaj kaszę z warzywami i połową passaty. Dopraw.",
                    "Papryki przekrój, oczyść i napełnij farszem.",
                    "Polej resztą passaty i piecz w 190°C ok. 30 minut.",
                ),
        ),
    ).associateBy { it.id }

internal fun sampleRecipe(id: String): RecipeUi? = sampleRecipes[id]

private fun slot(
    name: String,
    amount: Double,
    unit: String,
    vararg alternatives: RecipeIngredientOptionUi,
) = RecipeIngredientSlotUi(
    default = option(name, amount, unit),
    alternatives = alternatives.toList(),
    id = "sample-slot:$name:$amount:$unit",
)

private fun option(
    name: String,
    amount: Double,
    unit: String,
) = RecipeIngredientOptionUi(
    id = "sample:$name",
    name = name,
    amount = amount,
    unit = unit,
)

private fun alt(
    name: String,
    amount: Double,
    unit: String,
) = option(name, amount, unit)
