// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //

#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value.

using System.IO;
using UnityEngine;
using UnityEngine.UI;

namespace Animancer.Samples.TransitionLibraries
{
    /// <summary>
    /// An example component that manages save and load buttons.
    /// </summary>
    /// 
    /// <remarks>
    /// <strong>Sample:</strong>
    /// <see href="https://kybernetik.com.au/animancer/docs/samples/transition-libraries/serialization">
    /// Serialization</see>
    /// </remarks>
    /// 
    /// https://kybernetik.com.au/animancer/api/Animancer.Samples.TransitionLibraries/SerializationSampleUI
    /// 
    [AddComponentMenu(Strings.SamplesMenuPrefix + "Transition Libraries - Serialization Sample UI")]
    [AnimancerHelpUrl(typeof(SerializationSampleUI))]
    public class SerializationSampleUI : MonoBehaviour
    {
        /************************************************************************************************************************/

        [SerializeField] private Button _SaveButton;
        [SerializeField] private Button _LoadButton;
        [SerializeField] private AnimancerComponent _Animancer;
        [SerializeField] private string _FilePath = "Temp/AnimancerSerializedPose.dat";

        private readonly SerializablePose Pose = new();

        /************************************************************************************************************************/

        protected virtual void Awake()
        {
            _SaveButton.onClick.AddListener(Save);
            _LoadButton.onClick.AddListener(Load);
        }

        /************************************************************************************************************************/

        public void Save()
        {
            Pose.GatherFrom(_Animancer);

            using FileStream fileStream = new(_FilePath, FileMode.Create);
            using BinaryWriter binaryWriter = new(fileStream);

            Pose.Serialize(binaryWriter);
        }

        /************************************************************************************************************************/

        public void Load()
        {
            if (!File.Exists(_FilePath))
            {
                Debug.LogError("File hasn't been saved yet: " + _FilePath);
                return;
            }

            using FileStream fileStream = new(_FilePath, FileMode.Open);
            using BinaryReader binaryReader = new(fileStream);

            Pose.Deserialize(binaryReader);

            Pose.ApplyTo(_Animancer);
        }

        /************************************************************************************************************************/
    }
}
