/*****************************************************************************
 * Open MCT, Copyright (c) 2014-2017, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open MCT is licensed 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.
 *
 * Open MCT includes source code licensed under additional open source
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 * this source code distribution or the Licensing information page available
 * at runtime from the About dialog for additional information.
 *****************************************************************************/

define([
    "./src/objects/DomainObjectProvider",
    "./src/capabilities/CoreCapabilityProvider",
    "./src/models/StaticModelProvider",
    "./src/models/ModelAggregator",
    "./src/models/ModelCacheService",
    "./src/models/PersistedModelProvider",
    "./src/models/CachingModelDecorator",
    "./src/models/MissingModelDecorator",
    "./src/types/TypeProvider",
    "./src/actions/ActionProvider",
    "./src/actions/ActionAggregator",
    "./src/actions/LoggingActionDecorator",
    "./src/views/ViewProvider",
    "./src/identifiers/IdentifierProvider",
    "./src/capabilities/CompositionCapability",
    "./src/capabilities/RelationshipCapability",
    "./src/types/TypeCapability",
    "./src/actions/ActionCapability",
    "./src/views/ViewCapability",
    "./src/capabilities/PersistenceCapability",
    "./src/capabilities/MetadataCapability",
    "./src/capabilities/MutationCapability",
    "./src/capabilities/DelegationCapability",
    "./src/capabilities/InstantiationCapability",
    "./src/runs/TransactingMutationListener",
    "./src/services/Now",
    "./src/services/Throttle",
    "./src/services/Topic",
    "./src/services/Instantiate",
    'legacyRegistry'
], function (
    DomainObjectProvider,
    CoreCapabilityProvider,
    StaticModelProvider,
    ModelAggregator,
    ModelCacheService,
    PersistedModelProvider,
    CachingModelDecorator,
    MissingModelDecorator,
    TypeProvider,
    ActionProvider,
    ActionAggregator,
    LoggingActionDecorator,
    ViewProvider,
    IdentifierProvider,
    CompositionCapability,
    RelationshipCapability,
    TypeCapability,
    ActionCapability,
    ViewCapability,
    PersistenceCapability,
    MetadataCapability,
    MutationCapability,
    DelegationCapability,
    InstantiationCapability,
    TransactingMutationListener,
    Now,
    Throttle,
    Topic,
    Instantiate,
    legacyRegistry
) {

    legacyRegistry.register("platform/core", {
        "name": "Open MCT Core",
        "description": "Defines core concepts of Open MCT.",
        "sources": "src",
        "configuration": {
            "paths": {
                "uuid": "uuid"
            }
        },
        "extensions": {
            "versions": [
                {
                    "name": "Version",
                    "value": "@@version",
                    "priority": 999
                },
                {
                    "name": "Built",
                    "value": "@@timestamp",
                    "description": "The date on which this version of the client was built.",
                    "priority": 990
                },
                {
                    "name": "Revision",
                    "value": "@@revision",
                    "description": "A unique revision identifier for the client sources.",
                    "priority": 995
                },
                {
                    "name": "Branch",
                    "value": "@@branch",
                    "description": "The name of the branch that was used during the build.",
                    "priority": 994
                }
            ],
            "components": [
                {
                    "provides": "objectService",
                    "type": "provider",
                    "implementation": DomainObjectProvider,
                    "depends": [
                        "modelService",
                        "instantiate"
                    ]
                },
                {
                    "provides": "capabilityService",
                    "type": "provider",
                    "implementation": CoreCapabilityProvider,
                    "depends": [
                        "capabilities[]",
                        "$log"
                    ]
                },
                {
                    "provides": "modelService",
                    "type": "provider",
                    "implementation": StaticModelProvider,
                    "depends": [
                        "models[]",
                        "$q",
                        "$log"
                    ]
                },
                {
                    "provides": "modelService",
                    "type": "aggregator",
                    "implementation": ModelAggregator,
                    "depends": [
                        "$q"
                    ]
                },
                {
                    "provides": "modelService",
                    "type": "provider",
                    "implementation": PersistedModelProvider,
                    "depends": [
                        "persistenceService",
                        "$q",
                        "now",
                        "PERSISTENCE_SPACE"
                    ]
                },
                {
                    "provides": "modelService",
                    "type": "decorator",
                    "implementation": CachingModelDecorator,
                    "depends": [
                        "cacheService"
                    ]
                },
                {
                    "provides": "modelService",
                    "type": "decorator",
                    "priority": "fallback",
                    "implementation": MissingModelDecorator
                },
                {
                    "provides": "typeService",
                    "type": "provider",
                    "implementation": TypeProvider,
                    "depends": [
                        "types[]"
                    ]
                },
                {
                    "provides": "actionService",
                    "type": "provider",
                    "implementation": ActionProvider,
                    "depends": [
                        "actions[]",
                        "$log"
                    ]
                },
                {
                    "provides": "actionService",
                    "type": "aggregator",
                    "implementation": ActionAggregator
                },
                {
                    "provides": "actionService",
                    "type": "decorator",
                    "implementation": LoggingActionDecorator,
                    "depends": [
                        "$log"
                    ]
                },
                {
                    "provides": "viewService",
                    "type": "provider",
                    "implementation": ViewProvider,
                    "depends": [
                        "views[]",
                        "$log"
                    ]
                },
                {
                    "provides": "identifierService",
                    "type": "provider",
                    "implementation": IdentifierProvider,
                    "depends": [
                        "PERSISTENCE_SPACE"
                    ]
                }
            ],
            "types": [
                {
                    "properties": [
                        {
                            "control": "textfield",
                            "name": "Title",
                            "key": "name",
                            "property": "name",
                            "pattern": "\\S+",
                            "required": true,
                            "cssClass": "l-input-lg"
                        },
                        {
                            "name": "Notes",
                            "key": "notes",
                            "property": "notes",
                            "control": "textarea",
                            "required": false,
                            "cssClass": "l-textarea-sm"
                        }
                    ]
                },
                {
                    "key": "root",
                    "name": "Root",
                    "cssClass": "icon-folder"
                },
                {
                    "key": "folder",
                    "name": "Folder",
                    "cssClass": "icon-folder",
                    "features": "creation",
                    "description": "Create folders to organize other objects or links to objects.",
                    "priority": 1000,
                    "model": {
                        "composition": []
                    }
                },
                {
                    "key": "unknown",
                    "name": "Unknown Type",
                    "cssClass": "icon-object-unknown"
                },
                {
                    "name": "Unknown Type",
                    "cssClass": "icon-object-unknown"
                }
            ],
            "capabilities": [
                {
                    "key": "composition",
                    "implementation": CompositionCapability,
                    "depends": [
                        "$injector"
                    ]
                },
                {
                    "key": "relationship",
                    "implementation": RelationshipCapability,
                    "depends": [
                        "$injector"
                    ]
                },
                {
                    "key": "type",
                    "implementation": TypeCapability,
                    "depends": [
                        "typeService"
                    ]
                },
                {
                    "key": "action",
                    "implementation": ActionCapability,
                    "depends": [
                        "$q",
                        "actionService"
                    ]
                },
                {
                    "key": "view",
                    "implementation": ViewCapability,
                    "depends": [
                        "viewService"
                    ]
                },
                {
                    "key": "persistence",
                    "implementation": PersistenceCapability,
                    "depends": [
                        "cacheService",
                        "persistenceService",
                        "identifierService",
                        "notificationService",
                        "$q"
                    ]
                },
                {
                    "key": "metadata",
                    "implementation": MetadataCapability
                },
                {
                    "key": "mutation",
                    "implementation": MutationCapability,
                    "depends": [
                        "topic",
                        "now"
                    ]
                },
                {
                    "key": "delegation",
                    "implementation": DelegationCapability,
                    "depends": [
                        "$q"
                    ]
                },
                {
                    "key": "instantiation",
                    "implementation": InstantiationCapability,
                    "depends": [
                        "$injector",
                        "identifierService",
                        "now"
                    ]
                }
            ],
            "services": [
                {
                    "key": "cacheService",
                    "implementation": ModelCacheService
                },
                {
                    "key": "now",
                    "implementation": Now
                },
                {
                    "key": "throttle",
                    "implementation": Throttle,
                    "depends": [
                        "$timeout"
                    ]
                },
                {
                    "key": "topic",
                    "implementation": Topic,
                    "depends": [
                        "$log"
                    ]
                },
                {
                    "key": "instantiate",
                    "implementation": Instantiate,
                    "depends": [
                        "capabilityService",
                        "identifierService",
                        "cacheService"
                    ]
                }
            ],
            "runs": [
                {
                    "implementation": TransactingMutationListener,
                    "depends": ["topic", "transactionService", "cacheService"]
                }
            ],
            "constants": [
                {
                    "key": "PERSISTENCE_SPACE",
                    "value": "mct"
                }
            ],
            "licenses": [
                {
                    "name": "Math.uuid.js",
                    "version": "1.4.7",
                    "description": "Unique identifer generation (code adapted.)",
                    "author": "Robert Kieffer",
                    "website": "https://github.com/broofa/node-uuid",
                    "copyright": "Copyright (c) 2010-2012 Robert Kieffer",
                    "license": "license-mit",
                    "link": "http://opensource.org/licenses/MIT"
                }
            ]
        }
    });
});