using Google.Protobuf.WellKnownTypes;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;

namespace OASystem.Domain.ViewModels.QiYeWeChat
{
    /// <summary>
    /// 企业微信 审批 View
    /// </summary>
    public class ApprovalDataView : ResponseBase
    {
        /// <summary>
        /// 拉取的审批单个数,最大值为100,当total参数大于100时,可运用next_spnum参数进行多次拉取
        /// </summary>
        public int Count { get; set; }

        /// <summary>
        /// 时间段内的总审批单个数
        /// </summary>
        public int total { get; set; }

        /// <summary>
        /// 拉取列表的最后一个审批单号
        /// </summary>
        public long next_spnum { get; set; }

        /// <summary>
        /// 审批Data
        /// </summary>
        public List<Sp_Info>? data { get; set; }
    }

    /// <summary>
    /// 审批基本信息
    /// </summary>
    public class Sp_Info 
    {
        /// <summary>
        /// 审批名称(请假,报销,自定义审批名称)
        /// </summary>
        public string? spname { get; set; }

        /// <summary>
        /// 申请人姓名
        /// </summary>
        public string? apply_name { get; set; }

        /// <summary>
        /// 申请人部门
        /// </summary>
        public string? apply_org { get; set; }

        /// <summary>
        /// 审批人姓名
        /// </summary>
        public List<string>? approval_name { get; set; }

        /// <summary>
        /// 抄送人姓名
        /// </summary>
        public List<string>? notify_name { get; set; }

        /// <summary>
        /// 审批状态:1审批中;2 已通过;3已驳回;4已取消;6通过后撤销;10已支付
        /// </summary>
        public int sp_status { get; set; }

        /// <summary>
        /// 审批单号
        /// </summary>
        public long sp_num { get; set; }

        /// <summary>
        /// 请假类型(只有请假模板审批记录有此数据项)
        /// </summary>
        public Leave? leave { get; set; }

        /// <summary>
        /// 审批模板信息
        /// </summary>
        public Comm? comm { get; set; }

        ///// <summary>
        ///// 补卡时间
        ///// 打卡补卡 筛选使用
        ///// </summary>
        //public DateTime? comm_applydata_dt
        //{
        //    get
        //    {
        //        DateTime? dt = null;
        //        if (comm == null) return dt;

        //        if (comm.FillingDt != null)
        //        {
        //            dt = comm.FillingDt;
        //        }
        //        return dt;
        //    }
        //}


        /// <summary>
        /// 审批的附件media_id,可使用media/get获取附件
        /// </summary>
        public List<string>? mediaids { get; set; }

        /// <summary>
        /// 审批单提交时间 
        /// Unix时间戳
        /// </summary>
        public uint apply_time { get; set; }

        /// <summary>
        /// 审批单提交时间 
        /// datetime
        /// </summary>
        public DateTime apply_time_dt
        {
            get
            {
                return new DateTime(long.Parse(apply_time.ToString()) * 10000000 + 621355968000000000L).ToLocalTime();
            }
        }

        /// <summary>
        /// 审批单提交者的userid
        /// </summary>
        public string? apply_user_id { get; set; }

    }

    /// <summary>
    /// 审批类型
    /// </summary>
    public class Leave
    {
        /// <summary>
        /// 请假时间单位:0半天;1小时
        /// </summary>
        public int timeunit { get; set; }

        /// <summary>
        /// 请假类型
        /// 1年假;2事假;3病假;4调休假;5婚假;6产假;7陪产假;8其他
        /// </summary>
        public int leave_type { get; set; }

        /// <summary>
        /// 请假开始时间,unix时间
        /// </summary>
        public uint start_time { get; set; }

        /// <summary>
        /// 请假开始时间,datetime时间
        /// </summary>
        public DateTime start_time_dt
        {
            get
            {
                return new DateTime(long.Parse(start_time.ToString()) * 10000000 + 621355968000000000L).ToLocalTime();
            }
        }

        /// <summary>
        /// 请假结束时间,unix时间
        /// </summary>
        public uint end_time { get; set; }

        /// <summary>
        /// 请假开始时间,datetime时间
        /// </summary>
        public DateTime end_time_dt
        {
            get
            {
                return new DateTime(long.Parse(end_time.ToString()) * 10000000 + 621355968000000000L).ToLocalTime();
            }
        }


        /// <summary>
        /// 请假时长,单位小时
        /// </summary>
        public int duration { get; set; }

        /// <summary>
        /// 请假事由
        /// </summary>
        public string? reason { get; set; }

    }

    /// <summary>
    /// 审批模板信息
    /// </summary>
    public class Comm
    {
        /// <summary>
        /// 模板数据
        /// </summary>
        public string? apply_data { get; set; }

        public List<ApplyInfo>? applydata
        {
            get
            {
                List<ApplyInfo> applyInfos = new List<ApplyInfo>();

                if (!string.IsNullOrEmpty(apply_data)) 
                {
                    applyInfos = JsonConvert.DeserializeObject<List<ApplyInfo>>(apply_data);

                }
                return applyInfos;
            }
        }

        /// <summary>
        /// 补卡时间
        /// 筛选使用
        /// </summary>
        public DateTime? FillingDt {

            get 
            {
                DateTime? dt = null;
                if (applydata != null && applydata.Count > 0)
                {
                    ApplyInfo applyInfo = applydata.Where(it => it.id == "checkin-time").FirstOrDefault();
                    if (applyInfo != null)
                    {
                        dt = applyInfo.valueDt;

                    }
                }

                return dt;

            }

        }
    }

    /// <summary>
    /// 
    /// </summary>
    public class ApplyInfo
    {
        public string? id { get; set; }

        public string? title { get; set; }

        public string? type { get; set; }

        public object? value { get; set; }

        public DateTime? valueDt
        {
            get
            {
                if (id == "checkin-time" && value != null)
                {
                    long timeSpan = long.Parse(value.ToString()) / 1000;
                    return new DateTime(timeSpan * 10000000 + 621355968000000000L).ToLocalTime();
                }

                return null;
            }
        } 
    }
}