using System;
using System.IO;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Platform.Storage;
using PS2_Manager.Core;

namespace PS2_Manager;

public partial class GameInfo : UserControl
{
    public UpdateVar<Artwork.Type> ArtworkType { get; set; } = new UpdateVar<Artwork.Type>();
    public Game game { get; set; }
    public GameInfo(Game _game)
    {
        InitializeComponent();
        this.game = _game;
        ArtworkType.ValueChanged += UpdateArtworks;
        ArtworkType.Value = Artwork.Type.Front;
        
        GameNameTextBlock.Text = game.Name;
        GameIdTextBlock.Text = game.GameID;
        
        FileInfo fileInfo = new FileInfo(game.GamePath);
        IsoSizeTextBlock.Text = Util.FormatFileSize(fileInfo.Length);
        DateTime lastModified = fileInfo.LastWriteTime;
        string formattedDate = lastModified.ToString("dd.MM.yyyy HH:mm");
        GameDateTextBlock.Text = formattedDate;
    }



    private void UpdateArtworks()
    {
        
        Console.Info("Showing: " + ArtworkType.Value.ToString());
        Bitmap? tempBitmap = null;
        switch (ArtworkType.Value)
        {
            case Artwork.Type.Front:
                CoverContainer.Height = 292;
                tempBitmap = game.ArtworkFront;
                break;
            case Artwork.Type.Back:
                CoverContainer.Height = 292;
                tempBitmap = game.ArtworkBack;
                break;
            case Artwork.Type.Disc:
                CoverContainer.Height = CoverContainer.Width;
                tempBitmap = game.ArtworkDVD;
                break;
        }

        if (Util.IsBitmapEmpty(tempBitmap))
        {
            CoverContainer.Background = new SolidColorBrush(Color.Parse("#201c29"));
            CoverTextHint.IsVisible = true;
        }
        else
        {
            CoverContainer.Background = Brushes.Transparent;
            CoverTextHint.IsVisible = false;
        }
        


        CoverTextHint.Text = ArtworkType.Value.ToString();
  
        CoverImage.Source = tempBitmap;
    }
    
    private async void CoverImage_OnPointerPressed(object? sender, PointerPressedEventArgs e)
    {
        var topLevel = TopLevel.GetTopLevel(this);

        var files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
        {
            Title = "Select a Cover for the PS2 Game",
            AllowMultiple = false,
            FileTypeFilter = new []
            {
                Globals.FileDialogTypes.PS2Cover
            }
        });

        if (files.Count >= 1)
        {
            switch (ArtworkType.Value)
            {
                case Artwork.Type.Front:
                    this.game.ArtworkFront = new Bitmap(files[0].Path.LocalPath);
                    break;
                case Artwork.Type.Back:
                    this.game.ArtworkBack = new Bitmap(files[0].Path.LocalPath);
                    break;
                case Artwork.Type.Disc:
                    this.game.ArtworkDVD = new Bitmap(files[0].Path.LocalPath);
                    break;
            }
            Console.Info("Updating " + ArtworkType.Value + " Artwork for " + this.game.GameID);
            this.game.SaveCover(ArtworkType.Value);
            UpdateArtworks();
            MainWindow.RefreshGamesListTrigger?.Invoke(null, EventArgs.Empty);
        }
        else
        {
            Console.Error("OpenFilePicker was called but Canceled or no Files selected");
        }
    }

    private void NextButton(object? sender, RoutedEventArgs e)
    {
        this.ArtworkType.Value = Artwork.NextType(this.ArtworkType.Value);
    }

    private void PrevButton(object? sender, RoutedEventArgs e)
    {
        this.ArtworkType.Value = Artwork.PrevType(this.ArtworkType.Value);
    }
}