@page "/"
@layout PureBowlLayout

@rendermode RenderMode.InteractiveServer
@inject TamanoService TamanoService
@inject BaseBowlService BaseBowlService
@inject FrutaService FrutaService
@inject ToppingService ToppingService
@inject OfertaService OfertaService
@inject PedidoStateService PedidoState
@inject NavigationManager Nav

<PageTitle>PureBowl — Arma tu Bowl</PageTitle>

<div class="pb-hero">
    <h1>¡Crea tu Pure Bowl Perfecto!</h1>
    <p>Fresco y Natural Cada Día</p>
</div>

<div class="pb-wrapper">
    <div class="pb-configurator">

        @* PASO 1: TIPO DE PRODUCTO *@
        <div class="pb-section-title">
            <span class="pb-step-num">1</span> ¿Qué quieres ordenar?
        </div>
        <div class="pb-type-grid mb-4">
            <div class="pb-type-card @(tipoProducto == TipoProducto.PureBowl ? "selected" : "")"
                 @onclick="() => SeleccionarTipoProducto(TipoProducto.PureBowl)">
                <div style="font-size:40px">🥣</div>
                <h4>PureBowl</h4>
                <p>Bowl clásico con base de smoothie, frutas y toppings</p>
            </div>
            <div class="pb-type-card @(tipoProducto == TipoProducto.GriegoBowl ? "selected" : "")"
                 @onclick="() => SeleccionarTipoProducto(TipoProducto.GriegoBowl)">
                <div style="font-size:40px">🥛</div>
                <h4>Griego Bowl</h4>
                <p>Vaso con yogurt griego, 3 toppings y granola arriba</p>
            </div>
        </div>

        @if (tipoProducto != null)
        {
            @* PASO 2: TIPO DE BOWL (solo PureBowl) *@
            @if (tipoProducto == TipoProducto.PureBowl)
            {
                <div class="pb-step-label">
                    <span class="pb-step-num">2</span> Tipo de Bowl
                </div>
                <div class="pb-options-grid">
                    @foreach (var tipo in tiposBowl)
                    {
                        <div class="pb-option-card @(tipoBowlSeleccionado == tipo.Key ? "selected" : "")"
                             @onclick="() => SeleccionarTipoBowl(tipo.Key)">
                            <div class="pb-card-title">@tipo.Value</div>
                        </div>
                    }
                </div>
            }

            @* PASO 3: TAMAÑO *@
            @if (tipoProducto == TipoProducto.GriegoBowl || tipoBowlSeleccionado != null)
            {
                <div class="pb-step-label">
                    <span class="pb-step-num">@(tipoProducto == TipoProducto.GriegoBowl ? "2" : "3")</span> Tamaño
                </div>
                <div class="pb-options-grid">
                    @foreach (var t in tamanos)
                    {
                        <div class="pb-option-card @(tamanoSeleccionado?.TamanoId == t.TamanoId ? "selected" : "")"
                             @onclick="() => SeleccionarTamano(t)">
                            <div class="pb-card-title">@t.Nombre</div>
                            <div class="pb-card-price">RD$ @GetPrecioTamano(t).ToString("N0")</div>
                        </div>
                    }
                </div>
            }

            @* BASE (solo PureBowl) *@
            @if (tipoProducto == TipoProducto.PureBowl && tamanoSeleccionado != null)
            {
                <div class="pb-step-label">
                    <span class="pb-step-num">4</span> Base del Bowl
                </div>
                <div class="pb-options-grid">
                    @foreach (var b in bases)
                    {
                        <div class="pb-option-card @(baseSeleccionada?.BaseBowlId == b.BaseBowlId ? "selected" : "")"
                             @onclick="() => baseSeleccionada = b">
                            <div class="pb-card-title">@b.Nombre</div>
                        </div>
                    }
                </div>

                @* LÁCTEO *@
                @if (tipoBowlSeleccionado != TipoBowl.SinLacteo)
                {
                    <div class="pb-step-label">
                        <span class="pb-step-num">5</span> ¿Lácteo o Sin Lácteo?
                    </div>
                    <div class="pb-options-grid" style="grid-template-columns: 1fr 1fr;">
                        <div class="pb-option-card @(lacteoOpcion == "Con Yogurt" ? "selected" : "")"
                             @onclick='() => lacteoOpcion = "Con Yogurt"'>
                            <div class="pb-card-title">Con Yogurt</div>
                        </div>
                        <div class="pb-option-card @(lacteoOpcion == "Sin Lácteo" ? "selected" : "")"
                             @onclick='() => lacteoOpcion = "Sin Lácteo"'>
                            <div class="pb-card-title">Sin Lácteo</div>
                        </div>
                    </div>
                }

                @* FRUTAS *@
                @if (baseSeleccionada != null && (tipoBowlSeleccionado == TipoBowl.SinLacteo || !string.IsNullOrEmpty(lacteoOpcion)))
                {
                    int maxFrutas = tipoBowlSeleccionado == TipoBowl.SuperBowl ? 3 : 2;
                    <div class="pb-step-label">
                        <span class="pb-step-num">6</span> Elige tus Frutas (máx @maxFrutas)
                    </div>
                    <div class="pb-options-grid">
                        @foreach (var f in frutas)
                        {
                            bool seleccionada = frutasSeleccionadas.Contains(f.Nombre);
                            bool disabled = !seleccionada && frutasSeleccionadas.Count >= maxFrutas;
                            <div class="pb-option-card @(seleccionada ? "selected" : "") @(disabled ? "opacity-50" : "")"
                                 @onclick="() => ToggleFruta(f.Nombre, maxFrutas)">
                                <div class="pb-card-title">@f.Nombre</div>
                            </div>
                        }
                    </div>
                }
            }

            @* TOPPINGS GRIEGO BOWL (3 incluidos) *@
            @if (tipoProducto == TipoProducto.GriegoBowl && tamanoSeleccionado != null)
            {
                <div class="pb-step-label">
                    <span class="pb-step-num">3</span> Elige 3 Toppings (incluidos)
                </div>
                <div class="pb-options-grid">
                    @foreach (var tp in todosLosToppings)
                    {
                        bool sel = toppingsGriegoIncluidos.Contains(tp.Nombre);
                        bool dis = !sel && toppingsGriegoIncluidos.Count >= 3;
                        <div class="pb-option-card @(sel ? "selected" : "") @(dis ? "opacity-50" : "")"
                             @onclick="() => ToggleToppingGriego(tp.Nombre)">
                            <div class="pb-card-title">@tp.Nombre</div>
                            @if (tp.Tipo == TipoTopping.Premium)
                            {
                                <div class="pb-card-price">Premium</div>
                            }
                        </div>
                    }
                </div>
            }

            @* TOPPINGS EXTRAS (ambos tipos) *@
            @if ((tipoProducto == TipoProducto.PureBowl && frutasSeleccionadas.Count > 0) ||
                 (tipoProducto == TipoProducto.GriegoBowl && toppingsGriegoIncluidos.Count == 3))
            {
                <div class="pb-step-label">
                    <span class="pb-step-num">@(tipoProducto == TipoProducto.GriegoBowl ? "4" : "7")</span>
                    Toppings Extras (opcionales)
                </div>

                <p style="font-size:13px;color:#666;margin-bottom:12px;">
                    Básicos +RD$25 c/u &nbsp;|&nbsp; Premium +RD$50 c/u
                </p>

                <div class="pb-options-grid">
                    @foreach (var tp in todosLosToppings)
                    {
                        bool esIncluido = toppingsGriegoIncluidos.Contains(tp.Nombre);
                        if (esIncluido) continue;

                        bool sel = toppingsExtras.Contains(tp.Nombre);
                        <div class="pb-option-card @(sel ? "selected" : "")"
                             @onclick="() => ToggleToppingExtra(tp.Nombre)">
                            <div class="pb-card-title">@tp.Nombre</div>
                            <div class="pb-card-price">+RD$ @tp.Precio.ToString("N0")</div>
                        </div>
                    }
                </div>
            }

            @* NOTAS *@
            <div class="pb-step-label mt-3">
                <span class="pb-step-num">📝</span> Notas especiales (opcional)
            </div>
            <textarea class="pb-input" rows="3"
                      placeholder="Ej: Sin miel, extra granola..."
                      @bind="notas"></textarea>
        }

    </div>

    @* SIDEBAR RESUMEN *@
    <div class="pb-sidebar">
        <div class="pb-summary-card">
            <h4>🧾 Resumen de tu Pedido</h4>

            @if (tipoProducto != null)
            {
                <div class="pb-summary-item">
                    <span>Producto</span>
                    <strong>@GetNombreProducto()</strong>
                </div>
            }
            @if (tamanoSeleccionado != null)
            {
                <div class="pb-summary-item">
                    <span>Tamaño</span>
                    <strong>@tamanoSeleccionado.Nombre</strong>
                </div>
                <div class="pb-summary-item">
                    <span>Precio base</span>
                    <strong>RD$ @GetPrecioTamano(tamanoSeleccionado).ToString("N0")</strong>
                </div>
            }
            @if (baseSeleccionada != null)
            {
                <div class="pb-summary-item">
                    <span>Base</span>
                    <strong>@baseSeleccionada.Nombre</strong>
                </div>
            }
            @if (frutasSeleccionadas.Count > 0)
            {
                <div class="pb-summary-item">
                    <span>Frutas</span>
                    <strong>@string.Join(", ", frutasSeleccionadas)</strong>
                </div>
            }
            @if (toppingsGriegoIncluidos.Count > 0)
            {
                <div class="pb-summary-item">
                    <span>Toppings</span>
                    <strong>@string.Join(", ", toppingsGriegoIncluidos)</strong>
                </div>
            }
            @if (toppingsExtras.Count > 0)
            {
                <div class="pb-summary-item">
                    <span>Extras</span>
                    <strong>@string.Join(", ", toppingsExtras)</strong>
                </div>
                <div class="pb-summary-item">
                    <span>Costo extras</span>
                    <strong>+RD$ @GetCostoExtras().ToString("N0")</strong>
                </div>
            }

            <div class="pb-summary-total">
                <div class="pb-summary-item">
                    <span>TOTAL</span>
                    <strong style="color:var(--pb-purple)">RD$ @GetTotal().ToString("N0")</strong>
                </div>
            </div>

            <button class="pb-btn-primary" @onclick="IrAConfirmar" disabled="@(!PuedeProceder())">
                ORDENAR AHORA 🛒
            </button>
        </div>

        @if (oferta != null)
        {
            <div class="pb-promo">
                <strong>🎉 OFERTA DEL DÍA</strong>
                @oferta.Descripcion
            </div>
        }
    </div>
</div>

@code {
    private TipoProducto? tipoProducto;
    private TipoBowl? tipoBowlSeleccionado;
    private Tamano? tamanoSeleccionado;
    private BaseBowl? baseSeleccionada;
    private string lacteoOpcion = "";
    private List<string> frutasSeleccionadas = new();
    private List<string> toppingsGriegoIncluidos = new();
    private List<string> toppingsExtras = new();
    private string? notas;

    private List<Tamano> tamanos = new();
    private List<BaseBowl> bases = new();
    private List<Fruta> frutas = new();
    private List<Topping> todosLosToppings = new();
    private OfertaDelDia? oferta;

    private Dictionary<TipoBowl, string> tiposBowl = new()
    {
        { TipoBowl.Basico,       "Bowl Básico"       },
        { TipoBowl.SinLacteo,    "Bowl Sin Lácteo"   },
        { TipoBowl.SuperBowl,    "Super Bowl"        },
        { TipoBowl.YogurtGriego, "Bowl Yogurt Griego"},
    };

    protected override async Task OnInitializedAsync()
    {
        tamanos = await TamanoService.GetActivos();
        bases = await BaseBowlService.GetActivos();
        frutas = await FrutaService.GetActivos();
        todosLosToppings = await ToppingService.GetActivos();
        oferta = await OfertaService.GetActiva();
    }

    private void SeleccionarTipoProducto(TipoProducto tipo)
    {
        tipoProducto = tipo;
        tipoBowlSeleccionado = null;
        tamanoSeleccionado = null;
        baseSeleccionada = null;
        lacteoOpcion = "";
        frutasSeleccionadas = new();
        toppingsGriegoIncluidos = new();
        toppingsExtras = new();
    }

    private void SeleccionarTipoBowl(TipoBowl tipo)
    {
        tipoBowlSeleccionado = tipo;
        if (tipo == TipoBowl.SinLacteo) lacteoOpcion = "Sin Lácteo";
        frutasSeleccionadas = new();
    }

    private void SeleccionarTamano(Tamano t) => tamanoSeleccionado = t;

    private void ToggleFruta(string nombre, int max)
    {
        if (frutasSeleccionadas.Contains(nombre))
            frutasSeleccionadas.Remove(nombre);
        else if (frutasSeleccionadas.Count < max)
            frutasSeleccionadas.Add(nombre);
    }

    private void ToggleToppingGriego(string nombre)
    {
        if (toppingsGriegoIncluidos.Contains(nombre))
            toppingsGriegoIncluidos.Remove(nombre);
        else if (toppingsGriegoIncluidos.Count < 3)
            toppingsGriegoIncluidos.Add(nombre);
    }

    private void ToggleToppingExtra(string nombre)
    {
        if (toppingsExtras.Contains(nombre))
            toppingsExtras.Remove(nombre);
        else
            toppingsExtras.Add(nombre);
    }

    private decimal GetPrecioTamano(Tamano t)
    {
        if (tipoProducto == TipoProducto.GriegoBowl) return t.PrecioGriegoBowl;
        return tipoBowlSeleccionado != null ? t.GetPrecio(tipoBowlSeleccionado.Value) : t.PrecioBasico;
    }

    private decimal GetCostoExtras() =>
        toppingsExtras.Sum(nombre =>
            todosLosToppings.FirstOrDefault(t => t.Nombre == nombre)?.Precio ?? 0);

    private decimal GetTotal() =>
        (tamanoSeleccionado != null ? GetPrecioTamano(tamanoSeleccionado) : 0) + GetCostoExtras();

    private string GetNombreProducto() => tipoProducto switch
    {
        TipoProducto.GriegoBowl => "Griego Bowl (Vaso)",
        TipoProducto.PureBowl => tipoBowlSeleccionado != null
            ? tiposBowl[tipoBowlSeleccionado.Value]
            : "PureBowl",
        _ => ""
    };

    private bool PuedeProceder()
    {
        if (tipoProducto == null || tamanoSeleccionado == null) return false;

        if (tipoProducto == TipoProducto.GriegoBowl)
            return toppingsGriegoIncluidos.Count == 3;

        if (tipoBowlSeleccionado == null || baseSeleccionada == null) return false;
        if (tipoBowlSeleccionado != TipoBowl.SinLacteo && string.IsNullOrEmpty(lacteoOpcion)) return false;

        int maxFrutas = tipoBowlSeleccionado == TipoBowl.SuperBowl ? 3 : 2;
        return frutasSeleccionadas.Count == maxFrutas;
    }

    private void IrAConfirmar()
    {
        var toppingsBasicosNombres = toppingsExtras
            .Where(n => todosLosToppings.Any(t => t.Nombre == n && t.Tipo == TipoTopping.Basico))
            .ToList();

        var toppingsPremiumNombres = toppingsExtras
            .Where(n => todosLosToppings.Any(t => t.Nombre == n && t.Tipo == TipoTopping.Premium))
            .ToList();

        if (tipoProducto == TipoProducto.GriegoBowl)
        {
            toppingsBasicosNombres = toppingsGriegoIncluidos
                .Where(n => todosLosToppings.Any(t => t.Nombre == n && t.Tipo == TipoTopping.Basico))
                .Concat(toppingsBasicosNombres).ToList();

            toppingsPremiumNombres = toppingsGriegoIncluidos
                .Where(n => todosLosToppings.Any(t => t.Nombre == n && t.Tipo == TipoTopping.Premium))
                .Concat(toppingsPremiumNombres).ToList();
        }

        PedidoState.Config = new BowlConfig
        {
            TipoProducto = tipoProducto!.Value,
            TipoBowl = tipoBowlSeleccionado ?? TipoBowl.Basico,
            TamanoNombre = tamanoSeleccionado!.Nombre,
            TamanoPrecio = GetPrecioTamano(tamanoSeleccionado),
            BaseNombre = baseSeleccionada?.Nombre ?? "N/A",
            LacteoOpcion = tipoProducto == TipoProducto.GriegoBowl
                                    ? "Yogurt Griego"
                                    : lacteoOpcion,
            Frutas = frutasSeleccionadas,
            ToppingsBasicos = toppingsBasicosNombres,
            ToppingsPremium = toppingsPremiumNombres,
            CostoToppingsExtra = GetCostoExtras(),
            Notas = notas,
            Subtotal = GetTotal()
        };

        Nav.NavigateTo("/Pedido/Confirmar");
    }
}