﻿/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using DotCMIS.Data.Extensions;
using DotCMIS.Enums;

namespace DotCMIS.Data.Impl
{
    public class RepositoryInfo : ExtensionsData, IRepositoryInfo
    {
        public RepositoryInfo()
        {
        }

        public RepositoryInfo(IRepositoryInfo source)
        {
            Id = source.Id;
            Name = source.Name;
            Description = source.Description;
            VendorName = source.VendorName;
            ProductName = source.ProductName;
            ProductVersion = source.ProductVersion;
            RootFolderId = source.RootFolderId;
            Capabilities = source.Capabilities;
            AclCapabilities = source.AclCapabilities;
            LatestChangeLogToken = source.LatestChangeLogToken;
            CmisVersionSupported = source.CmisVersionSupported;
            ThinClientUri = source.ThinClientUri;
            ChangesIncomplete = source.ChangesIncomplete;
            ChangesOnType = source.ChangesOnType;
            PrincipalIdAnonymous = source.PrincipalIdAnonymous;
            PrincipalIdAnyone = source.PrincipalIdAnyone;
        }

        public string Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string VendorName { get; set; }
        public string ProductName { get; set; }
        public string ProductVersion { get; set; }
        public string RootFolderId { get; set; }
        public IRepositoryCapabilities Capabilities { get; set; }
        public IAclCapabilities AclCapabilities { get; set; }
        public string LatestChangeLogToken { get; set; }
        public string CmisVersionSupported { get; set; }
        public string ThinClientUri { get; set; }
        public bool? ChangesIncomplete { get; set; }
        public IList<BaseTypeId?> ChangesOnType { get; set; }
        public string PrincipalIdAnonymous { get; set; }
        public string PrincipalIdAnyone { get; set; }
    }

    public class RepositoryCapabilities : ExtensionsData, IRepositoryCapabilities
    {
        public CapabilityContentStreamUpdates? ContentStreamUpdatesCapability { get; set; }
        public CapabilityChanges? ChangesCapability { get; set; }
        public CapabilityRenditions? RenditionsCapability { get; set; }
        public bool? IsGetDescendantsSupported { get; set; }
        public bool? IsGetFolderTreeSupported { get; set; }
        public bool? IsMultifilingSupported { get; set; }
        public bool? IsUnfilingSupported { get; set; }
        public bool? IsVersionSpecificFilingSupported { get; set; }
        public bool? IsPwcSearchableSupported { get; set; }
        public bool? IsPwcUpdatableSupported { get; set; }
        public bool? IsAllVersionsSearchableSupported { get; set; }
        public CapabilityQuery? QueryCapability { get; set; }
        public CapabilityJoin? JoinCapability { get; set; }
        public CapabilityAcl? AclCapability { get; set; }
    }

    public class AclCapabilities : ExtensionsData, IAclCapabilities
    {
        public SupportedPermissions? SupportedPermissions { get; set; }
        public AclPropagation? AclPropagation { get; set; }
        public IList<IPermissionDefinition> Permissions { get; set; }
        public IDictionary<string, IPermissionMapping> PermissionMapping { get; set; }
    }

    public class PermissionDefinition : ExtensionsData, IPermissionDefinition
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }

    public class PermissionMapping : ExtensionsData, IPermissionMapping
    {
        public string Key { get; set; }
        public IList<string> Permissions { get; set; }
    }

    public abstract class AbstractTypeDefinition : ExtensionsData, ITypeDefinition
    {
        private List<IPropertyDefinition> propertyDefintionList = new List<IPropertyDefinition>();
        private Dictionary<string, IPropertyDefinition> propertyDefintionDict = new Dictionary<string, IPropertyDefinition>();
        private string parentTypeId;

        public string Id { get; set; }
        public string LocalName { get; set; }
        public string LocalNamespace { get; set; }
        public string DisplayName { get; set; }
        public string QueryName { get; set; }
        public string Description { get; set; }
        public BaseTypeId BaseTypeId { get; set; }
        public string ParentTypeId
        {
            get { return parentTypeId; }
            set { parentTypeId = (value == null || value.Length == 0 ? null : value); }
        }
        public bool? IsCreatable { get; set; }
        public bool? IsFileable { get; set; }
        public bool? IsQueryable { get; set; }
        public bool? IsFulltextIndexed { get; set; }
        public bool? IsIncludedInSupertypeQuery { get; set; }
        public bool? IsControllablePolicy { get; set; }
        public bool? IsControllableAcl { get; set; }
        public IPropertyDefinition this[string propertyId]
        {
            get
            {
                IPropertyDefinition propertyDefinition = null;
                propertyDefintionDict.TryGetValue(propertyId, out propertyDefinition);
                return propertyDefinition;
            }
        }
        public IList<IPropertyDefinition> PropertyDefinitions
        {
            get
            {
                return propertyDefintionList;
            }
        }

        public void Initialize(ITypeDefinition typeDefinition)
        {
            Id = typeDefinition.Id;
            LocalName = typeDefinition.LocalName;
            LocalNamespace = typeDefinition.LocalNamespace;
            DisplayName = typeDefinition.DisplayName;
            QueryName = typeDefinition.QueryName;
            Description = typeDefinition.Description;
            BaseTypeId = typeDefinition.BaseTypeId;
            ParentTypeId = typeDefinition.ParentTypeId;
            IsCreatable = typeDefinition.IsCreatable;
            IsFileable = typeDefinition.IsFileable;
            IsQueryable = typeDefinition.IsQueryable;
            IsFulltextIndexed = typeDefinition.IsFulltextIndexed;
            IsIncludedInSupertypeQuery = typeDefinition.IsIncludedInSupertypeQuery;
            IsControllablePolicy = typeDefinition.IsControllablePolicy;
            IsControllableAcl = typeDefinition.IsControllableAcl;


            if (typeDefinition.PropertyDefinitions != null)
            {
                foreach (IPropertyDefinition propDef in typeDefinition.PropertyDefinitions)
                {
                    AddPropertyDefinition(propDef);
                }
            }
        }

        public void AddPropertyDefinition(IPropertyDefinition propertyDefinition)
        {
            if (propertyDefinition == null || propertyDefinition.Id == null)
            {
                return;
            }

            propertyDefintionList.Add(propertyDefinition);
            propertyDefintionDict[propertyDefinition.Id] = propertyDefinition;
        }
    }

    public class DocumentTypeDefinition : AbstractTypeDefinition, IDocumentTypeDefinition
    {
        public bool? IsVersionable { get; set; }
        public ContentStreamAllowed? ContentStreamAllowed { get; set; }
    }

    public class FolderTypeDefinition : AbstractTypeDefinition, IFolderTypeDefinition
    {
    }

    public class PolicyTypeDefinition : AbstractTypeDefinition, IPolicyTypeDefinition
    {
    }

    public class RelationshipTypeDefinition : AbstractTypeDefinition, IRelationshipTypeDefinition
    {
        public IList<string> AllowedSourceTypeIds { get; set; }
        public IList<string> AllowedTargetTypeIds { get; set; }
    }

    public class TypeDefinitionList : ExtensionsData, ITypeDefinitionList
    {
        public IList<ITypeDefinition> List { get; set; }
        public bool? HasMoreItems { get; set; }
        public long? NumItems { get; set; }
    }

    public class TypeDefinitionContainer : ExtensionsData, ITypeDefinitionContainer
    {
        public ITypeDefinition TypeDefinition { get; set; }
        public IList<ITypeDefinitionContainer> Children { get; set; }
    }

    public abstract class PropertyDefinition : ExtensionsData, IPropertyDefinition
    {
        public string Id { get; set; }
        public string LocalName { get; set; }
        public string LocalNamespace { get; set; }
        public string DisplayName { get; set; }
        public string QueryName { get; set; }
        public string Description { get; set; }
        public PropertyType PropertyType { get; set; }
        public Cardinality Cardinality { get; set; }
        public Updatability Updatability { get; set; }
        public bool? IsInherited { get; set; }
        public bool? IsRequired { get; set; }
        public bool? IsQueryable { get; set; }
        public bool? IsOrderable { get; set; }
        public bool? IsOpenChoice { get; set; }
    }

    public class Choice<T> : IChoice<T>
    {
        public string DisplayName { get; set; }
        public IList<T> Value { get; set; }
        public IList<IChoice<T>> Choices { get; set; }
    }

    public class PropertyBooleanDefinition : PropertyDefinition, IPropertyBooleanDefinition
    {
        public IList<bool> DefaultValue { get; set; }
        public IList<IChoice<bool>> Choices { get; set; }
    }

    public class PropertyDateTimeDefinition : PropertyDefinition, IPropertyDateTimeDefinition
    {
        public IList<DateTime> DefaultValue { get; set; }
        public IList<IChoice<DateTime>> Choices { get; set; }
        public DateTimeResolution? DateTimeResolution { get; set; }
    }

    public class PropertyDecimalDefinition : PropertyDefinition, IPropertyDecimalDefinition
    {
        public IList<decimal> DefaultValue { get; set; }
        public IList<IChoice<decimal>> Choices { get; set; }
        public decimal? MinValue { get; set; }
        public decimal? MaxValue { get; set; }
        public DecimalPrecision? Precision { get; set; }
    }

    public class PropertyHtmlDefinition : PropertyDefinition, IPropertyHtmlDefinition
    {
        public IList<string> DefaultValue { get; set; }
        public IList<IChoice<string>> Choices { get; set; }
    }

    public class PropertyIdDefinition : PropertyDefinition, IPropertyIdDefinition
    {
        public IList<string> DefaultValue { get; set; }
        public IList<IChoice<string>> Choices { get; set; }
    }

    public class PropertyIntegerDefinition : PropertyDefinition, IPropertyIntegerDefinition
    {
        public IList<long> DefaultValue { get; set; }
        public IList<IChoice<long>> Choices { get; set; }
        public long? MinValue { get; set; }
        public long? MaxValue { get; set; }
    }

    public class PropertyStringDefinition : PropertyDefinition, IPropertyStringDefinition
    {
        public IList<string> DefaultValue { get; set; }
        public IList<IChoice<string>> Choices { get; set; }
        public long? MaxLength { get; set; }
    }

    public class PropertyUriDefinition : PropertyDefinition, IPropertyUriDefinition
    {
        public IList<string> DefaultValue { get; set; }
        public IList<IChoice<string>> Choices { get; set; }
    }

    public class ObjectData : ExtensionsData, IObjectData
    {
        public string Id
        {
            get
            {
                return GetFirstValue(PropertyIds.ObjectId) as string;
            }
        }
        public BaseTypeId? BaseTypeId
        {
            get
            {
                string baseTypeId = GetFirstValue(PropertyIds.BaseTypeId) as string;
                if (baseTypeId == null)
                {
                    return null;
                }

                return baseTypeId.GetCmisEnum<BaseTypeId>();
            }
        }
        public IProperties Properties { get; set; }
        public IAllowableActions AllowableActions { get; set; }
        public IList<IObjectData> Relationships { get; set; }
        public IChangeEventInfo ChangeEventInfo { get; set; }
        public IAcl Acl { get; set; }
        public bool? IsExactAcl { get; set; }
        public IPolicyIdList PolicyIds { get; set; }
        public IList<IRenditionData> Renditions { get; set; }

        private object GetFirstValue(string id)
        {
            if (Properties == null) { return null; }

            IPropertyData property = Properties[id];
            if (property == null)
            {
                return null;
            }

            return property.FirstValue;
        }
    }

    public class ObjectList : ExtensionsData, IObjectList
    {
        public IList<IObjectData> Objects { get; set; }
        public bool? HasMoreItems { get; set; }
        public long? NumItems { get; set; }
    }

    public class ObjectInFolderData : ExtensionsData, IObjectInFolderData
    {
        public IObjectData Object { get; set; }
        public string PathSegment { get; set; }
    }

    public class ObjectInFolderList : ExtensionsData, IObjectInFolderList
    {
        public IList<IObjectInFolderData> Objects { get; set; }
        public bool? HasMoreItems { get; set; }
        public long? NumItems { get; set; }
    }

    public class ObjectInFolderContainer : ExtensionsData, IObjectInFolderContainer
    {
        public IObjectInFolderData Object { get; set; }
        public IList<IObjectInFolderContainer> Children { get; set; }
    }

    public class ObjectParentData : ExtensionsData, IObjectParentData
    {
        public IObjectData Object { get; set; }
        public string RelativePathSegment { get; set; }
    }

    public class Properties : ExtensionsData, IProperties
    {
        private List<IPropertyData> propertyList = new List<IPropertyData>();
        private Dictionary<string, IPropertyData> propertyDict = new Dictionary<string, IPropertyData>();

        public IPropertyData this[string propertyId]
        {
            get
            {
                IPropertyData property = null;
                propertyDict.TryGetValue(propertyId, out property);
                return property;
            }
        }

        public IList<IPropertyData> PropertyList
        {
            get
            {
                return propertyList;
            }
        }

        public void AddProperty(IPropertyData property)
        {
            if (property == null)
            {
                return;
            }

            propertyList.Add(property);

            if (property.Id != null)
            {
                propertyDict[property.Id] = property;
            }
        }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            foreach (IPropertyData prop in propertyList)
            {
                if (sb.Length == 0) { sb.Append("["); }
                else { sb.Append(", "); }
                sb.Append(prop.ToString());
            }
            sb.Append("]");

            return sb.ToString();
        }
    }

    public class PropertyData : ExtensionsData, IPropertyData
    {
        private IList<object> values;

        public PropertyData(PropertyType propertyType)
        {
            PropertyType = propertyType;
        }

        public string Id { get; set; }

        public string LocalName { get; set; }

        public string DisplayName { get; set; }

        public string QueryName { get; set; }

        public PropertyType PropertyType { get; protected set; }

        public IList<object> Values
        {
            get { return values; }
            set
            {
                if (value == null)
                {
                    values = null;
                }
                else
                {
                    foreach (object o in value)
                    {
                        CheckValue(o);
                    }

                    values = value;
                }
            }
        }

        public object FirstValue { get { return values == null || Values.Count < 1 ? null : values[0]; } }

        public void AddValue(object value)
        {
            CheckValue(value);

            if (Values == null)
            {
                Values = new List<object>();
            }

            Values.Add(value);
        }

        public void CheckValue(object value)
        {
            switch (PropertyType)
            {
                case PropertyType.String:
                    if (!(value is string))
                    {
                        throw new ArgumentException("Property '" + Id + "' is a String property!");
                    }
                    break;
                case PropertyType.Id:
                    if (!(value is string))
                    {
                        throw new ArgumentException("Property '" + Id + "' is an Id property!");
                    }
                    break;
                case PropertyType.Integer:
                    if (!(value is sbyte || value is byte || value is short || value is ushort || value is int || value is uint || value is long))
                    {
                        throw new ArgumentException("Property '" + Id + "' is an Id property!");
                    }
                    break;
                case PropertyType.Boolean:
                    if (!(value is bool))
                    {
                        throw new ArgumentException("Property '" + Id + "' is a Boolean property!");
                    }
                    break;
                case PropertyType.DateTime:
                    if (!(value is DateTime))
                    {
                        throw new ArgumentException("Property '" + Id + "' is a DateTime property!");
                    }
                    break;
                case PropertyType.Decimal:
                    if (!(value is decimal))
                    {
                        throw new ArgumentException("Property '" + Id + "' is a Decimal property!");
                    }
                    break;
                case PropertyType.Uri:
                    if (!(value is string))
                    {
                        throw new ArgumentException("Property '" + Id + "' is a URI property!");
                    }
                    break;
                case PropertyType.Html:
                    if (!(value is string))
                    {
                        throw new ArgumentException("Property '" + Id + "' is a HTML property!");
                    }
                    break;
            }
        }

        public override string ToString()
        {
            return Id + ": " + values;
        }
    }

    public class Principal : ExtensionsData, IPrincipal
    {
        public string Id { get; set; }
    }

    public class Ace : ExtensionsData, IAce
    {
        public IPrincipal Principal { get; set; }
        public string PrincipalId { get { return Principal == null ? null : Principal.Id; } }
        public IList<string> Permissions { get; set; }
        public bool IsDirect { get; set; }
    }

    public class Acl : ExtensionsData, IAcl
    {
        public IList<IAce> Aces { get; set; }
        public bool? IsExact { get; set; }
    }

    public class ContentStream : ExtensionsData, IContentStream
    {
        public long? Length { get; set; }
        public string MimeType { get; set; }
        public string FileName { get; set; }
        public Stream Stream { get; set; }
    }

    public class AllowableActions : ExtensionsData, IAllowableActions
    {
        public HashSet<string> Actions { get; set; }
    }

    public class RenditionData : ExtensionsData, IRenditionData
    {
        public string StreamId { get; set; }
        public string MimeType { get; set; }
        public long? Length { get; set; }
        public string Kind { get; set; }
        public string Title { get; set; }
        public long? Height { get; set; }
        public long? Width { get; set; }
        public string RenditionDocumentId { get; set; }
    }

    public class ChangeEventInfo : ExtensionsData, IChangeEventInfo
    {
        public ChangeType? ChangeType { get; set; }
        public DateTime? ChangeTime { get; set; }
    }

    public class PolicyIdList : ExtensionsData, IPolicyIdList
    {
        public IList<string> PolicyIds { get; set; }
    }

    public class FailedToDeleteData : ExtensionsData, IFailedToDeleteData
    {
        public IList<string> Ids { get; set; }
    }
}
