﻿#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#endregion

using System;
using System.Buffers;
using System.Runtime.CompilerServices;
using System.Security;

namespace Google.Protobuf
{
    /// <summary>
    /// An opaque struct that represents the current serialization state and is passed along
    /// as the serialization proceeds.
    /// All the public methods are intended to be invoked only by the generated code,
    /// users should never invoke them directly.
    /// </summary>
    [SecuritySafeCritical]
    public ref struct WriteContext
    {
        internal Span<byte> buffer;
        internal WriterInternalState state;

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        internal static void Initialize(ref Span<byte> buffer, ref WriterInternalState state, out WriteContext ctx)
        {
            ctx.buffer = buffer;
            ctx.state = state;
        }

        /// <summary>
        /// Creates a WriteContext instance from CodedOutputStream.
        /// WARNING: internally this copies the CodedOutputStream's state, so after done with the WriteContext,
        /// the CodedOutputStream's state needs to be updated.
        /// </summary>
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        internal static void Initialize(CodedOutputStream output, out WriteContext ctx)
        {
            ctx.buffer = new Span<byte>(output.InternalBuffer);
            // ideally we would use a reference to the original state, but that doesn't seem possible
            // so we just copy the struct that holds the state. We will need to later store the state back
            // into CodedOutputStream if we want to keep it usable.
            ctx.state = output.InternalState;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        internal static void Initialize(IBufferWriter<byte> output, out WriteContext ctx)
        {
            ctx.buffer = default;
            ctx.state = default;
            WriteBufferHelper.Initialize(output, out ctx.state.writeBufferHelper, out ctx.buffer);
            ctx.state.limit = ctx.buffer.Length;
            ctx.state.position = 0;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        internal static void Initialize(ref Span<byte> buffer, out WriteContext ctx)
        {
            ctx.buffer = buffer;
            ctx.state = default;
            ctx.state.limit = ctx.buffer.Length;
            ctx.state.position = 0;
            WriteBufferHelper.InitializeNonRefreshable(out ctx.state.writeBufferHelper);
        }

        /// <summary>
        /// Writes a double field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteDouble(double value) => WritingPrimitives.WriteDouble(ref buffer, ref state, value);

        /// <summary>
        /// Writes a float field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteFloat(float value) => WritingPrimitives.WriteFloat(ref buffer, ref state, value);

        /// <summary>
        /// Writes a uint64 field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteUInt64(ulong value) => WritingPrimitives.WriteUInt64(ref buffer, ref state, value);

        /// <summary>
        /// Writes an int64 field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteInt64(long value) => WritingPrimitives.WriteInt64(ref buffer, ref state, value);

        /// <summary>
        /// Writes an int32 field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteInt32(int value) => WritingPrimitives.WriteInt32(ref buffer, ref state, value);

        /// <summary>
        /// Writes a fixed64 field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteFixed64(ulong value) => WritingPrimitives.WriteFixed64(ref buffer, ref state, value);

        /// <summary>
        /// Writes a fixed32 field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteFixed32(uint value) => WritingPrimitives.WriteFixed32(ref buffer, ref state, value);

        /// <summary>
        /// Writes a bool field value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteBool(bool value) => WritingPrimitives.WriteBool(ref buffer, ref state, value);

        /// <summary>
        /// Writes a string field value, without a tag.
        /// The data is length-prefixed.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteString(string value) => WritingPrimitives.WriteString(ref buffer, ref state, value);

        /// <summary>
        /// Writes a message, without a tag.
        /// The data is length-prefixed.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteMessage(IMessage value) => WritingPrimitivesMessages.WriteMessage(ref this, value);

        /// <summary>
        /// Writes a group, without a tag, to the stream.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteGroup(IMessage value) => WritingPrimitivesMessages.WriteGroup(ref this, value);

        /// <summary>
        /// Write a byte string, without a tag, to the stream.
        /// The data is length-prefixed.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteBytes(ByteString value) => WritingPrimitives.WriteBytes(ref buffer, ref state, value);

        /// <summary>
        /// Writes a uint32 value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteUInt32(uint value) => WritingPrimitives.WriteUInt32(ref buffer, ref state, value);

        /// <summary>
        /// Writes an enum value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteEnum(int value) => WritingPrimitives.WriteEnum(ref buffer, ref state, value);

        /// <summary>
        /// Writes an sfixed32 value, without a tag.
        /// </summary>
        /// <param name="value">The value to write.</param>
        public void WriteSFixed32(int value) => WritingPrimitives.WriteSFixed32(ref buffer, ref state, value);

        /// <summary>
        /// Writes an sfixed64 value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteSFixed64(long value) => WritingPrimitives.WriteSFixed64(ref buffer, ref state, value);

        /// <summary>
        /// Writes an sint32 value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteSInt32(int value) => WritingPrimitives.WriteSInt32(ref buffer, ref state, value);

        /// <summary>
        /// Writes an sint64 value, without a tag.
        /// </summary>
        /// <param name="value">The value to write</param>
        public void WriteSInt64(long value) => WritingPrimitives.WriteSInt64(ref buffer, ref state, value);

        /// <summary>
        /// Writes a length (in bytes) for length-delimited data.
        /// </summary>
        /// <remarks>
        /// This method simply writes a rawint, but exists for clarity in calling code.
        /// </remarks>
        /// <param name="length">Length value, in bytes.</param>
        public void WriteLength(int length) => WritingPrimitives.WriteLength(ref buffer, ref state, length);

        /// <summary>
        /// Encodes and writes a tag.
        /// </summary>
        /// <param name="fieldNumber">The number of the field to write the tag for</param>
        /// <param name="type">The wire format type of the tag to write</param>
        public void WriteTag(int fieldNumber, WireFormat.WireType type) => WritingPrimitives.WriteTag(ref buffer, ref state, fieldNumber, type);

        /// <summary>
        /// Writes an already-encoded tag.
        /// </summary>
        /// <param name="tag">The encoded tag</param>
        public void WriteTag(uint tag) => WritingPrimitives.WriteTag(ref buffer, ref state, tag);

        /// <summary>
        /// Writes the given single-byte tag.
        /// </summary>
        /// <param name="b1">The encoded tag</param>
        public void WriteRawTag(byte b1) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1);

        /// <summary>
        /// Writes the given two-byte tag.
        /// </summary>
        /// <param name="b1">The first byte of the encoded tag</param>
        /// <param name="b2">The second byte of the encoded tag</param>
        public void WriteRawTag(byte b1, byte b2) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2);

        /// <summary>
        /// Writes the given three-byte tag.
        /// </summary>
        /// <param name="b1">The first byte of the encoded tag</param>
        /// <param name="b2">The second byte of the encoded tag</param>
        /// <param name="b3">The third byte of the encoded tag</param>
        public void WriteRawTag(byte b1, byte b2, byte b3) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3);

        /// <summary>
        /// Writes the given four-byte tag.
        /// </summary>
        /// <param name="b1">The first byte of the encoded tag</param>
        /// <param name="b2">The second byte of the encoded tag</param>
        /// <param name="b3">The third byte of the encoded tag</param>
        /// <param name="b4">The fourth byte of the encoded tag</param>
        public void WriteRawTag(byte b1, byte b2, byte b3, byte b4) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3, b4);

        /// <summary>
        /// Writes the given five-byte tag.
        /// </summary>
        /// <param name="b1">The first byte of the encoded tag</param>
        /// <param name="b2">The second byte of the encoded tag</param>
        /// <param name="b3">The third byte of the encoded tag</param>
        /// <param name="b4">The fourth byte of the encoded tag</param>
        /// <param name="b5">The fifth byte of the encoded tag</param>
        public void WriteRawTag(byte b1, byte b2, byte b3, byte b4, byte b5) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3, b4, b5);

        internal void Flush() => WriteBufferHelper.Flush(ref buffer, ref state);

        internal void CheckNoSpaceLeft() => WriteBufferHelper.CheckNoSpaceLeft(ref state);

        internal void CopyStateTo(CodedOutputStream output)
        {
            output.InternalState = state;
        }

        internal void LoadStateFrom(CodedOutputStream output)
        {
            state = output.InternalState;
        }
    }
}