/**
 * Autogenerated by Thrift Compiler (0.14.1)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Thrift;
using Thrift.Collections;

using Thrift.Protocol;
using Thrift.Protocol.Entities;
using Thrift.Protocol.Utilities;
using Thrift.Transport;
using Thrift.Transport.Client;
using Thrift.Transport.Server;
using Thrift.Processor;


#pragma warning disable IDE0079  // remove unnecessary pragmas
#pragma warning disable IDE1006  // parts of the code use IDL spelling


public partial class TSInsertRecordReq : TBase
{

  public long SessionId { get; set; }

  public string DeviceId { get; set; }

  public List<string> Measurements { get; set; }

  public byte[] Values { get; set; }

  public long Timestamp { get; set; }

  public TSInsertRecordReq()
  {
  }

  public TSInsertRecordReq(long sessionId, string deviceId, List<string> measurements, byte[] values, long timestamp) : this()
  {
    this.SessionId = sessionId;
    this.DeviceId = deviceId;
    this.Measurements = measurements;
    this.Values = values;
    this.Timestamp = timestamp;
  }

  public TSInsertRecordReq DeepCopy()
  {
    var tmp89 = new TSInsertRecordReq();
    tmp89.SessionId = this.SessionId;
    if((DeviceId != null))
    {
      tmp89.DeviceId = this.DeviceId;
    }
    if((Measurements != null))
    {
      tmp89.Measurements = this.Measurements.DeepCopy();
    }
    if((Values != null))
    {
      tmp89.Values = this.Values.ToArray();
    }
    tmp89.Timestamp = this.Timestamp;
    return tmp89;
  }

  public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken)
  {
    iprot.IncrementRecursionDepth();
    try
    {
      bool isset_sessionId = false;
      bool isset_deviceId = false;
      bool isset_measurements = false;
      bool isset_values = false;
      bool isset_timestamp = false;
      TField field;
      await iprot.ReadStructBeginAsync(cancellationToken);
      while (true)
      {
        field = await iprot.ReadFieldBeginAsync(cancellationToken);
        if (field.Type == TType.Stop)
        {
          break;
        }

        switch (field.ID)
        {
          case 1:
            if (field.Type == TType.I64)
            {
              SessionId = await iprot.ReadI64Async(cancellationToken);
              isset_sessionId = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 2:
            if (field.Type == TType.String)
            {
              DeviceId = await iprot.ReadStringAsync(cancellationToken);
              isset_deviceId = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 3:
            if (field.Type == TType.List)
            {
              {
                TList _list90 = await iprot.ReadListBeginAsync(cancellationToken);
                Measurements = new List<string>(_list90.Count);
                for(int _i91 = 0; _i91 < _list90.Count; ++_i91)
                {
                  string _elem92;
                  _elem92 = await iprot.ReadStringAsync(cancellationToken);
                  Measurements.Add(_elem92);
                }
                await iprot.ReadListEndAsync(cancellationToken);
              }
              isset_measurements = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 4:
            if (field.Type == TType.String)
            {
              Values = await iprot.ReadBinaryAsync(cancellationToken);
              isset_values = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 5:
            if (field.Type == TType.I64)
            {
              Timestamp = await iprot.ReadI64Async(cancellationToken);
              isset_timestamp = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          default: 
            await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            break;
        }

        await iprot.ReadFieldEndAsync(cancellationToken);
      }

      await iprot.ReadStructEndAsync(cancellationToken);
      if (!isset_sessionId)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
      if (!isset_deviceId)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
      if (!isset_measurements)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
      if (!isset_values)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
      if (!isset_timestamp)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
    }
    finally
    {
      iprot.DecrementRecursionDepth();
    }
  }

  public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken cancellationToken)
  {
    oprot.IncrementRecursionDepth();
    try
    {
      var struc = new TStruct("TSInsertRecordReq");
      await oprot.WriteStructBeginAsync(struc, cancellationToken);
      var field = new TField();
      field.Name = "sessionId";
      field.Type = TType.I64;
      field.ID = 1;
      await oprot.WriteFieldBeginAsync(field, cancellationToken);
      await oprot.WriteI64Async(SessionId, cancellationToken);
      await oprot.WriteFieldEndAsync(cancellationToken);
      if((DeviceId != null))
      {
        field.Name = "deviceId";
        field.Type = TType.String;
        field.ID = 2;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteStringAsync(DeviceId, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if((Measurements != null))
      {
        field.Name = "measurements";
        field.Type = TType.List;
        field.ID = 3;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        {
          await oprot.WriteListBeginAsync(new TList(TType.String, Measurements.Count), cancellationToken);
          foreach (string _iter93 in Measurements)
          {
            await oprot.WriteStringAsync(_iter93, cancellationToken);
          }
          await oprot.WriteListEndAsync(cancellationToken);
        }
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if((Values != null))
      {
        field.Name = "values";
        field.Type = TType.String;
        field.ID = 4;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteBinaryAsync(Values, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      field.Name = "timestamp";
      field.Type = TType.I64;
      field.ID = 5;
      await oprot.WriteFieldBeginAsync(field, cancellationToken);
      await oprot.WriteI64Async(Timestamp, cancellationToken);
      await oprot.WriteFieldEndAsync(cancellationToken);
      await oprot.WriteFieldStopAsync(cancellationToken);
      await oprot.WriteStructEndAsync(cancellationToken);
    }
    finally
    {
      oprot.DecrementRecursionDepth();
    }
  }

  public override bool Equals(object that)
  {
    if (!(that is TSInsertRecordReq other)) return false;
    if (ReferenceEquals(this, other)) return true;
    return System.Object.Equals(SessionId, other.SessionId)
      && System.Object.Equals(DeviceId, other.DeviceId)
      && TCollections.Equals(Measurements, other.Measurements)
      && TCollections.Equals(Values, other.Values)
      && System.Object.Equals(Timestamp, other.Timestamp);
  }

  public override int GetHashCode() {
    int hashcode = 157;
    unchecked {
      hashcode = (hashcode * 397) + SessionId.GetHashCode();
      if((DeviceId != null))
      {
        hashcode = (hashcode * 397) + DeviceId.GetHashCode();
      }
      if((Measurements != null))
      {
        hashcode = (hashcode * 397) + TCollections.GetHashCode(Measurements);
      }
      if((Values != null))
      {
        hashcode = (hashcode * 397) + Values.GetHashCode();
      }
      hashcode = (hashcode * 397) + Timestamp.GetHashCode();
    }
    return hashcode;
  }

  public override string ToString()
  {
    var sb = new StringBuilder("TSInsertRecordReq(");
    sb.Append(", SessionId: ");
    SessionId.ToString(sb);
    if((DeviceId != null))
    {
      sb.Append(", DeviceId: ");
      DeviceId.ToString(sb);
    }
    if((Measurements != null))
    {
      sb.Append(", Measurements: ");
      Measurements.ToString(sb);
    }
    if((Values != null))
    {
      sb.Append(", Values: ");
      Values.ToString(sb);
    }
    sb.Append(", Timestamp: ");
    Timestamp.ToString(sb);
    sb.Append(')');
    return sb.ToString();
  }
}

