﻿using System;
/*
 * 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.Collections.Generic;
using System.IO;
using DotCMIS.Data.Extensions;
using DotCMIS.Enums;

namespace DotCMIS.Data
{
    public interface IRepositoryInfo : IExtensionsData
    {
        string Id { get; }
        string Name { get; }
        string Description { get; }
        string VendorName { get; }
        string ProductName { get; }
        string ProductVersion { get; }
        string RootFolderId { get; }
        IRepositoryCapabilities Capabilities { get; }
        IAclCapabilities AclCapabilities { get; }
        string LatestChangeLogToken { get; }
        string CmisVersionSupported { get; }
        string ThinClientUri { get; }
        bool? ChangesIncomplete { get; }
        IList<BaseTypeId?> ChangesOnType { get; }
        string PrincipalIdAnonymous { get; }
        string PrincipalIdAnyone { get; }
    }

    public interface IRepositoryCapabilities : IExtensionsData
    {
        CapabilityContentStreamUpdates? ContentStreamUpdatesCapability { get; }
        CapabilityChanges? ChangesCapability { get; }
        CapabilityRenditions? RenditionsCapability { get; }
        bool? IsGetDescendantsSupported { get; }
        bool? IsGetFolderTreeSupported { get; }
        bool? IsMultifilingSupported { get; }
        bool? IsUnfilingSupported { get; }
        bool? IsVersionSpecificFilingSupported { get; }
        bool? IsPwcSearchableSupported { get; }
        bool? IsPwcUpdatableSupported { get; }
        bool? IsAllVersionsSearchableSupported { get; }
        CapabilityQuery? QueryCapability { get; }
        CapabilityJoin? JoinCapability { get; }
        CapabilityAcl? AclCapability { get; }
    }

    public interface IAclCapabilities : IExtensionsData
    {
        SupportedPermissions? SupportedPermissions { get; }
        AclPropagation? AclPropagation { get; }
        IList<IPermissionDefinition> Permissions { get; }
        IDictionary<string, IPermissionMapping> PermissionMapping { get; }
    }

    public interface IPermissionDefinition : IExtensionsData
    {
        string Id { get; }
        string Description { get; }
    }

    public interface IPermissionMapping : IExtensionsData
    {
        string Key { get; }
        IList<string> Permissions { get; }
    }

    public interface ITypeDefinition : IExtensionsData
    {
        string Id { get; }
        string LocalName { get; }
        string LocalNamespace { get; }
        string DisplayName { get; }
        string QueryName { get; }
        string Description { get; }
        BaseTypeId BaseTypeId { get; }
        string ParentTypeId { get; }
        bool? IsCreatable { get; }
        bool? IsFileable { get; }
        bool? IsQueryable { get; }
        bool? IsFulltextIndexed { get; }
        bool? IsIncludedInSupertypeQuery { get; }
        bool? IsControllablePolicy { get; }
        bool? IsControllableAcl { get; }
        IPropertyDefinition this[string propertyId] { get; }
        IList<IPropertyDefinition> PropertyDefintions { get; }
    }

    public interface IDocumentTypeDefinition : ITypeDefinition
    {
        bool? IsVersionable { get; }
        ContentStreamAllowed? ContentStreamAllowed { get; }
    }

    public interface IFolderTypeDefinition : ITypeDefinition
    {
    }

    public interface IPolicyTypeDefinition : ITypeDefinition
    {
    }

    public interface IRelationshipTypeDefinition : ITypeDefinition
    {
        IList<string> AllowedSourceTypeIds { get; }
        IList<string> AllowedTargetTypeIds { get; }
    }

    public interface ITypeDefinitionList : IExtensionsData
    {
        IList<ITypeDefinition> List { get; }
        bool? HasMoreItems { get; }
        long? NumItems { get; }
    }

    public interface ITypeDefinitionContainer : IExtensionsData
    {
        ITypeDefinition TypeDefinition { get; }
        IList<ITypeDefinitionContainer> Children { get; }
    }

    public interface IPropertyDefinition : IExtensionsData
    {
        string Id { get; }
        string LocalName { get; }
        string LocalNamespace { get; }
        string DisplayName { get; }
        string QueryName { get; }
        string Description { get; }
        PropertyType PropertyType { get; }
        Cardinality Cardinality { get; }
        Updatability Updatability { get; }
        bool? IsInherited { get; }
        bool? IsRequired { get; }
        bool? IsQueryable { get; }
        bool? IsOrderable { get; }
        bool? IsOpenChoice { get; }
    }

    public interface IChoice<T>
    {
        string DisplayName { get; }
        IList<T> Value { get; }
        IList<IChoice<T>> Choices { get; }
    }

    public interface IPropertyBooleanDefinition : IPropertyDefinition
    {
        IList<bool> DefaultValue { get; }
        IList<IChoice<bool>> Choices { get; }
    }

    public interface IPropertyDateTimeDefinition : IPropertyDefinition
    {
        IList<DateTime> DefaultValue { get; }
        IList<IChoice<DateTime>> Choices { get; }
        DateTimeResolution? DateTimeResolution { get; }
    }

    public interface IPropertyDecimalDefinition : IPropertyDefinition
    {
        IList<decimal> DefaultValue { get; }
        IList<IChoice<decimal>> Choices { get; }
        decimal? MinValue { get; }
        decimal? MaxValue { get; }
        DecimalPrecision? Precision { get; }
    }

    public interface IPropertyHtmlDefinition : IPropertyDefinition
    {
        IList<string> DefaultValue { get; }
        IList<IChoice<string>> Choices { get; }
    }

    public interface IPropertyIdDefinition : IPropertyDefinition
    {
        IList<string> DefaultValue { get; }
        IList<IChoice<string>> Choices { get; }
    }

    public interface IPropertyIntegerDefinition : IPropertyDefinition
    {
        IList<long> DefaultValue { get; }
        IList<IChoice<long>> Choices { get; }
        long? MinValue { get; }
        long? MaxValue { get; }
    }

    public interface IPropertyStringDefinition : IPropertyDefinition
    {
        IList<string> DefaultValue { get; }
        IList<IChoice<string>> Choices { get; }
        long? MaxLength { get; }
    }

    public interface IPropertyUriDefinition : IPropertyDefinition
    {
        IList<string> DefaultValue { get; }
        IList<IChoice<string>> Choices { get; }
    }

    public interface IObjectData : IExtensionsData
    {
        string Id { get; }
        BaseTypeId? BaseTypeId { get; }
        IProperties Properties { get; }
        IAllowableActions AllowableActions { get; }
        IList<IObjectData> Relationships { get; }
        IChangeEventInfo ChangeEventInfo { get; }
        IAcl Acl { get; }
        bool? IsExactAcl { get; }
        IPolicyIdList PolicyIds { get; }
        IList<IRenditionData> Renditions { get; }
    }

    public interface IObjectList : IExtensionsData
    {
        IList<IObjectData> Objects { get; }
        bool? HasMoreItems { get; }
        long? NumItems { get; }
    }

    public interface IObjectInFolderData : IExtensionsData
    {
        IObjectData Object { get; }
        string PathSegment { get; }
    }

    public interface IObjectInFolderList : IExtensionsData
    {
        IList<IObjectInFolderData> Objects { get; }
        bool? HasMoreItems { get; }
        long? NumItems { get; }
    }

    public interface IObjectInFolderContainer : IExtensionsData
    {
        IObjectInFolderData Object { get; }
        IList<IObjectInFolderContainer> Children { get; }
    }

    public interface IObjectParentData : IExtensionsData
    {
        IObjectData Object { get; }
        string RelativePathSegment { get; }
    }

    public interface IProperties : IExtensionsData
    {
        IPropertyData this[string propertyId] { get; }
        IList<IPropertyData> PropertyList { get; }
    }

    public interface IPropertyData : IExtensionsData
    {
        string Id { get; }
        string LocalName { get; }
        string DisplayName { get; }
        string QueryName { get; }
        PropertyType PropertyType { get; }
        IList<object> Values { get; }
        object FirstValue { get; }
    }

    public interface IPrincipal : IExtensionsData
    {
        string Id { get; }
    }

    public interface IAce : IExtensionsData
    {
        IPrincipal Principal { get; }
        string PrincipalId { get; }
        IList<string> Permissions { get; }
        bool IsDirect { get; }
    }

    public interface IAcl : IExtensionsData
    {
        IList<IAce> Aces { get; }
        bool? IsExact { get; }
    }

    public interface IContentStream : IExtensionsData
    {
        long? Length { get; }
        string MimeType { get; }
        string FileName { get; }
        Stream Stream { get; }
    }

    public interface IAllowableActions : IExtensionsData
    {
        HashSet<string> Actions { get; }
    }

    public interface IRenditionData : IExtensionsData
    {
        string StreamId { get; }
        string MimeType { get; }
        long? Length { get; }
        string Kind { get; }
        string Title { get; }
        long? Height { get; }
        long? Width { get; }
        string RenditionDocumentId { get; }
    }

    public interface IChangeEventInfo : IExtensionsData
    {
        ChangeType? ChangeType { get; }
        DateTime? ChangeTime { get; }
    }

    public interface IPolicyIdList : IExtensionsData
    {
        IList<string> PolicyIds { get; }
    }

    public interface IFailedToDeleteData : IExtensionsData
    {
        IList<string> Ids { get; }
    }
}
