using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
using System;
using SharpCompress.Writers;

namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson
{


    public class ExportExcelDateConverter : DateTimeConverterBase
    {
        private readonly TimeZoneInfo _clientTimeZone;

        public ExportExcelDateConverter(TimeZoneInfo clientTimeZone)
        {
            _clientTimeZone = clientTimeZone;
        }
        public override bool CanConvert(Type objectType)
        {
            
            return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            DateTime? nullableDateTime = value as DateTime?;

            if (nullableDateTime != null && nullableDateTime.HasValue)
            {
                // 将服务器时间转换为客户端时间
                DateTime clientTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, TimeZoneInfo.Local, _clientTimeZone);
                writer.WriteValue(clientTime);
            }
            else
            {
                writer.WriteNull();
            }

         
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            DateTime? nullableDateTime = reader.Value as DateTime?;

            if (nullableDateTime != null && nullableDateTime.HasValue)

            {    // 服务器时区的时间转为客户端时间
                var clientZoneTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, TimeZoneInfo.Local, _clientTimeZone);

                return clientZoneTime;
            }
            return reader.Value;


        }


    }
    public  class ExportExcelConverterDate
    {
        public static T ConvertToClientTimeInObject<T>(T obj, string timeZoneId)
        {
            var clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
            if (obj == null)
                return obj;

            // 将对象序列化为 JSON 字符串
            string json = JsonConvert.SerializeObject(obj);

            // 将 JSON 字符串反序列化回对象
            var deserializedObj = JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings
            {
                Converters = { new ExportExcelDateConverter(clientTimeZone) }
            });

            return deserializedObj!;
        }
    }
}