//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------

namespace System.Activities.Statements
{
    using System;
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    using System.Runtime;
    using System.Diagnostics.CodeAnalysis;
    using System.ComponentModel;

    [Fx.Tag.XamlVisible(false)]
    [DataContract]
    class CompensationTokenData
    {
        internal CompensationTokenData(long compensationId, long parentCompensationId)
        {
            this.CompensationId = compensationId;
            this.ParentCompensationId = parentCompensationId;
            this.BookmarkTable = new BookmarkTable();
            this.ExecutionTracker = new ExecutionTracker();
            this.CompensationState = CompensationState.Creating;
        }

        [DataMember(EmitDefaultValue = false)]
        internal long CompensationId
        {
            get;
            set;
        }

        [DataMember(EmitDefaultValue = false)]
        internal long ParentCompensationId
        {
            get;
            set;
        }

        [DataMember]
        internal BookmarkTable BookmarkTable
        {
            get;
            set;
        }

        [DataMember]
        internal ExecutionTracker ExecutionTracker
        {
            get;
            set;
        }

        [DefaultValue(CompensationState.Active)]
        [DataMember(EmitDefaultValue = false)]
        internal CompensationState CompensationState
        {
            get;
            set;
        }

        [DataMember(EmitDefaultValue = false)]
        internal string DisplayName
        {
            get;
            set;
        }
        
        [DataMember(EmitDefaultValue = false)]
        internal bool IsTokenValidInSecondaryRoot
        {
            get;
            set;
        }

        internal void RemoveBookmark(NativeActivityContext context, CompensationBookmarkName bookmarkName)
        {
            Bookmark bookmark = this.BookmarkTable[bookmarkName];

            if (bookmark != null)
            {
                context.RemoveBookmark(bookmark); 
                this.BookmarkTable[bookmarkName] = null;
            }
        }
    }
}