using Microsoft.Kinect;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows;

namespace Lib
{
    class DepthImageStream : KinectStream
    {
        private DepthFrameReader reader;
        public DepthFrameReader Reader
        {
            get
            {
                return reader;
            }
            set
            {
                reader = value;
            }
        }
        private byte[] depthPixels;
        public byte[] DepthPixels {
            get {
                return depthPixels; 
            }
            set
            {
                depthPixels = value;
            }
        }
        public DepthImageStream(KinectManager kinectManager) : base(kinectManager)
        {
            var frameDescription = KinectManager.Sensor.DepthFrameSource.FrameDescription;
            this.Bitmap = new WriteableBitmap(frameDescription.Width, frameDescription.Height, 96.0, 96.0, PixelFormats.Gray8, null);
            reader = KinectManager.Sensor.DepthFrameSource.OpenReader();
            reader.FrameArrived += Reader_DepthFrameArrived;
            DepthPixels = new byte[frameDescription.Width * frameDescription.Height];
        }
        private void Reader_DepthFrameArrived(object sender, DepthFrameArrivedEventArgs e)
        {
            using (DepthFrame depthFrame = e.FrameReference.AcquireFrame())
            {
                if (depthFrame != null)
                {
                    FrameDescription depthFrameDescription = depthFrame.FrameDescription;

                    // Créez un tableau pour stocker les données de profondeur
                    ushort[] depthData = new ushort[depthFrameDescription.LengthInPixels];
                    depthFrame.CopyFrameDataToArray(depthData);

                    // Traitez les données de profondeur
                    ProcessDepthFrameData(depthData, depthFrameDescription.LengthInPixels, depthFrame.DepthMinReliableDistance, depthFrame.DepthMaxReliableDistance);

                    // Mettez à jour le bitmap de profondeur
                    this.Bitmap.WritePixels(
                        new Int32Rect(0, 0, depthFrameDescription.Width, depthFrameDescription.Height),
                        this.depthPixels,
                        depthFrameDescription.Width,
                        0);
                }
            }
        }

        public override void Stop()
        {
            if (reader != null)
            {
                reader.Dispose();
                reader = null;
            }
        }

        private void ProcessDepthFrameData(ushort[] depthData, uint depthFrameDataSize, ushort minDepth, ushort maxDepth)
        {
            // Convertir les données de profondeur en niveaux de gris
            for (int i = 0; i < depthFrameDataSize; ++i)
            {
                ushort depth = depthData[i];
                DepthPixels[i] = (byte)(depth >= minDepth && depth <= maxDepth ? (depth % 256) : 0);
            }
        }

    }
}
