using CocktailWeb.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.EntityFrameworkCore;

namespace CocktailWeb.Pages.Settings
{
    public partial class CocktailEdit
    {
        [Parameter]
        public string? id { get; set; }
        public List<Flasche> FlaschenListe { get; set; } = new();

        public Cocktail EditCocktail = null!;

        private IBrowserFile? CocktaiLBildDatei;
        private DbDataContext? _DataContext;

        protected override async Task OnInitializedAsync()
        {
            if (id != null)
            {
                _DataContext ??= await DataContextFactory.CreateDbContextAsync();
                if (_DataContext != null)
                {
                    EditCocktail = _DataContext.Cocktails.Include(c => c.Cocktailflaschen).ThenInclude(cf => cf.Flasche).Single(c => c.Id == Convert.ToInt32(id));
                }
            }
            // Falls keine ID angegeben wurde oder der Cocktail in der Datenbank nicht gefunden wurde, gehen wir davon aus dass ein neuer Cocktail erstellt wird.
            if (EditCocktail == null)
            {
                EditCocktail = new();
            }

            await FillFlaschenListe();
            await InvokeAsync(StateHasChanged);
        }

        public async Task FillFlaschenListe()
        {
            _DataContext ??= await DataContextFactory.CreateDbContextAsync();
            if (_DataContext != null)
            {
                FlaschenListe = await _DataContext.Flaschen.OrderBy(f => f.Name).ToListAsync();
            }
        }

        public void FlascheHinzufuegen(MouseEventArgs e, Flasche f)
        {
            EditCocktail?.Cocktailflaschen.Add(new CocktailFlasche() { Flasche = f, Reihenfolge = EditCocktail.Cocktailflaschen.Count + 1 });
            CocktailFlaschenSortieren();
        }

        public void FlascheEntfernen(MouseEventArgs e, CocktailFlasche cf)
        {
            EditCocktail?.Cocktailflaschen.Remove(cf);
            CocktailFlaschenSortieren();
        }

        /// <summary>
        /// Geht die Liste durch und setzt die Reihenfolge neu
        /// </summary>
        void CocktailFlaschenSortieren()
        {
            // Reihenfolge neu sortieren, damit keine Lücken entstehen 
            int i = 1;
            foreach (var c in EditCocktail.Cocktailflaschen.OrderBy(cf => cf.Reihenfolge))
            {
                c.Reihenfolge = i;
                i++;
            }
        }

        public void FlascheReihenfolge(MouseEventArgs e, CocktailFlasche cf, int Richtung)
        {
            cf.Reihenfolge += Richtung;
            CocktailFlaschenSortieren();
        }

        public void Bild_OnChange(InputFileChangeEventArgs e)
        {
            CocktaiLBildDatei = e.GetMultipleFiles().FirstOrDefault();
            //this.StateHasChanged(); War in nem Stackexchange.. Nötig?
        }
        private async Task OnSubmit(EventArgs e)
        {
            _DataContext ??= await DataContextFactory.CreateDbContextAsync();

            if (EditCocktail != null && _DataContext != null)
            {
                if (id != null)
                {
                    _DataContext.Cocktails.Update(EditCocktail);
                }
                else
                {
                    _DataContext.Cocktails.Add(EditCocktail);
                }
                await _DataContext.SaveChangesAsync();

                if (CocktaiLBildDatei != null)
                {
                    try
                    {
                        // Bild hochladen
                        var relativeuploadpath = Path.Join(Config.Value.ImageUploadDir, $"cocktail_{EditCocktail.Id}{Path.GetExtension(CocktaiLBildDatei.Name)}");
                        var fullpath = Path.Join(env.WebRootPath, relativeuploadpath);
                        string? folder = Path.GetDirectoryName(fullpath);
                        if (folder != null && !Path.Exists(folder)) Directory.CreateDirectory(folder);

                        Stream stream = CocktaiLBildDatei.OpenReadStream(maxAllowedSize: Config.Value.MaxAllowedUploadSizeInMB * 1024 * 1024);
                        FileStream fs = File.Create(fullpath);
                        await stream.CopyToAsync(fs);
                        stream.Close();
                        fs.Close();
                        EditCocktail.ImageURL = relativeuploadpath;
                        // URL hinterlegen und wieder speichern
                        _DataContext.Cocktails.Update(EditCocktail);
                        await _DataContext.SaveChangesAsync();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"Error uploading image: {ex.Message}");
                    }
                }
            }
            nav.NavigateTo("/settings/cocktails");
        }
    }
}
