/*
 * 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.
 */
package org.apache.sling.mongodb.impl;

import java.util.Map;

import org.apache.sling.api.resource.AbstractResource;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.wrappers.DeepReadModifiableValueMapDecorator;
import org.apache.sling.api.wrappers.DeepReadValueMapDecorator;

import com.mongodb.DBObject;

public class MongoDBResource extends AbstractResource {

    /** The complete resource path. */
    private final String resourcePath;

    /** The collection */
    private final String collection;

    /** The resource resolver. */
    private final ResourceResolver resourceResolver;

    /** Metadata. */
    protected ResourceMetadata metadata = new ResourceMetadata();

    /** The db object. */
    private DBObject dbObject;

    /** The MongoDB resource provider. */
    private final MongoDBResourceProvider provider;

    public MongoDBResource(final ResourceResolver resolver,
                    final String resourcePath,
                    final String collection,
                    final DBObject dbObject,
                    final MongoDBResourceProvider provider) {
        this.resourceResolver = resolver;
        this.resourcePath = resourcePath;
        this.collection = collection;
        this.dbObject = dbObject;
        this.provider = provider;
    }

    public MongoDBResource(final MongoDBResource source) {
        this.resourceResolver = source.resourceResolver;
        this.resourcePath = source.resourcePath;
        this.collection = source.collection;
        this.dbObject = source.dbObject;
        this.provider = source.provider;
    }
    /**
     * @see org.apache.sling.api.resource.Resource#getPath()
     */
    public String getPath() {
        return this.resourcePath;
    }

    /**
     * @see org.apache.sling.api.resource.Resource#getResourceType()
     */
    public String getResourceType() {
        // get resource type from data
        final Object rt = this.dbObject.get("sling:resourceType");
        if ( rt != null ) {
            return rt.toString();
        }
        return "nt:unstructured";
    }

    /**
     * @see org.apache.sling.api.resource.Resource#getResourceSuperType()
     */
    public String getResourceSuperType() {
        // get resource type from data
        final Object rt = this.dbObject.get("sling:resourceSuperType");
        if ( rt != null ) {
            return rt.toString();
        }
        return null;
    }

    /**
     * @see org.apache.sling.api.resource.Resource#getResourceMetadata()
     */
    public ResourceMetadata getResourceMetadata() {
        return this.metadata;
    }

    /**
     * @see org.apache.sling.api.resource.Resource#getResourceResolver()
     */
    public ResourceResolver getResourceResolver() {
        return this.resourceResolver;
    }

    /**
     * @see org.apache.sling.api.adapter.SlingAdaptable#adaptTo(java.lang.Class)
     */
    @SuppressWarnings("unchecked")
    @Override
    public <AdapterType> AdapterType adaptTo(final Class<AdapterType> type) {
        if ( type == ValueMap.class || type == Map.class ) {
            this.dbObject = this.provider.getUpdatedDBObject(this.resourcePath, this.dbObject);
            return (AdapterType) new DeepReadValueMapDecorator(this, new ReadableValueMap(this.dbObject));
        } else if ( type == ModifiableValueMap.class ) {
            this.dbObject = this.provider.getUpdatedDBObject(this.resourcePath, this.dbObject);
            return (AdapterType) new DeepReadModifiableValueMapDecorator(this, new ChangeableValueMap(this));
        }

        return super.adaptTo(type);
    }

    /**
     * Return the collection.
     */
    public String getCollection() {
        return this.collection;
    }

    /**
     * Get the current properties.
     */
    public DBObject getProperties() {
        return this.dbObject;
    }

    @Override
    public String toString() {
        return "MongoDBResource [resourcePath=" + resourcePath + ", dbPath=" + this.dbObject.get(provider.getPROP_PATH()) + ", collection=" + collection
                        + ", resourceResolver=" + resourceResolver + "]";
    }

    public void changed() {
        this.provider.changed(this);
    }
}
