using System.IO;
using System.Text;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Media.Imaging;
using Avalonia.Platform.Storage;
using MES.Utility.Core;
using SkiaSharp;
using Ursa.Controls;
using ZXing;
using 常用工具集.Base;
using 常用工具集.Utility.Qrcode;

namespace 常用工具集;

public partial class 二维码条形码生成 : UserControl
{
    private SKBitmap Image;
    private string svg;
    public 二维码条形码生成()
    {
        InitializeComponent();
    }

    private Bitmap BitmapToBitmapImage(SKBitmap skBitmap)
    {
        byte[] bytes = null;
        using (MemoryStream stream = new MemoryStream())
        {
            skBitmap.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
            bytes = stream.ToArray();
        }
        using (MemoryStream stream = new MemoryStream(bytes))
        {
            return new Bitmap(stream);
        }
    }

    private void btnGenerate_Click(object sender, RoutedEventArgs e)
    {
        if (txtContent.Text.IsNullOrEmpty())
        {
            MessageBox.ShowAsync("请输入内容");
            return;
        }
        if (rdChecked1.IsChecked.Value)
        {
            SKBitmap image = QRCodeUtils.EncodeQrCode(txtContent.Text, 900, out svg);
            Image = image;
            image1.Source = BitmapToBitmapImage(image);
        }
        else if (rdChecked2.IsChecked.Value)
        {
            SKBitmap image = DataMatrixUtils.EncodeDataMatrix(DmtxSymbolSize.DmtxSymbol12x12, txtContent.Text, 900, out svg);
            Image = image;
            image1.Source = BitmapToBitmapImage(image);
        }
        else if (rdChecked3.IsChecked.Value)
        {
            SKBitmap image = DataMatrixUtils.EncodeDataMatrix(DmtxSymbolSize.DmtxSymbol16x16, txtContent.Text, 900, out svg);
            Image = image;
            image1.Source = BitmapToBitmapImage(image);
        }
        else if (rdChecked4.IsChecked.Value)
        {
            SKBitmap image = BarCodeUtils.EncodeBarCode(BarcodeFormat.CODE_39, txtContent.Text, 900, 500, out svg);
            Image = image;
            image1.Source = BitmapToBitmapImage(image);
        }
        else if (rdChecked5.IsChecked.Value)
        {
            SKBitmap image = BarCodeUtils.EncodeBarCode(BarcodeFormat.CODE_128, txtContent.Text, 900, 500, out svg);
            Image = image;
            image1.Source = BitmapToBitmapImage(image);
        }
    }
    private async void btnSave_Click(object sender, RoutedEventArgs e)
    {
        if (Image == null)
            return;

        var sp = GlobalValues.StorageProvider;
        if (sp is null) return;
        var result = await sp.SaveFilePickerAsync(new FilePickerSaveOptions()
        {
            Title = "保存图像",
            DefaultExtension = "png"
        });
        if (result == null) return;
        string temp = result.Path.LocalPath;
        Save(temp, Image);
    }

    private void Save(string path, SKBitmap bitmap)
    {
        using (var stream = File.OpenWrite(path))
        {
            bitmap.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
        }
    }
    private async void btnSaveSVG_Click(object sender, RoutedEventArgs e)
    {
        if (Image == null)
            return;
        var sp = GlobalValues.StorageProvider;
        if (sp is null) return;
        var result = await sp.SaveFilePickerAsync(new FilePickerSaveOptions()
        {
            Title = "保存SVG",
            DefaultExtension = "svg"
        });
        if (result == null) return;
        string temp = result.Path.LocalPath;
        System.IO.File.WriteAllText(temp, svg, Encoding.UTF8);
    }

    private void TextBox_KeyDown(object? sender, Avalonia.Input.KeyEventArgs e)
    {
        if (e.KeyModifiers == Avalonia.Input.KeyModifiers.Control)
        {
            e.Handled = true;
            if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
            {
                return;
            }

            if (e.Key == Key.V)
            {

            }
            return;
        }
        if (e.Key == Key.Enter)
        {
            btnGenerate_Click(sender, e);
        }
        else if (e.KeyModifiers == KeyModifiers.Control && e.Key == Key.S)
        {
            e.Handled = true;
            btnSave_Click(sender, e);
        }
    }


    private void UserControl_KeyDown(object? sender, Avalonia.Input.KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            btnGenerate_Click(sender, e);
        }
        else if (e.KeyModifiers == KeyModifiers.Control && e.Key == Key.C)
        {
            e.Handled = true;
            if (Image == null)
                return;
            byte[] bytes = null;
            using (MemoryStream stream = new MemoryStream())
            {
                Image.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
                bytes = stream.ToArray();
            }
            DataObject clipboardData = new DataObject();
            clipboardData.Set(DataFormats.Files, BitmapToBitmapImage(Image));
            GlobalValues.Clipboard.SetDataObjectAsync(clipboardData);
        }
        else if (e.KeyModifiers == KeyModifiers.Control && e.Key == Key.S)
        {
            e.Handled = true;
            btnSave_Click(sender, e);
        }
    }


}