/*
 * 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.photark.jcr.services;

import java.io.File;
import java.net.URL;
import java.util.logging.Logger;

import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.apache.photark.jcr.JCRRepositoryManager;
import org.apache.photark.services.album.Album;
import org.apache.photark.services.gallery.BaseGalleryImpl;
import org.apache.photark.services.gallery.Gallery;
import org.oasisopen.sca.annotation.Init;
import org.oasisopen.sca.annotation.Reference;
import org.oasisopen.sca.annotation.Scope;

@Scope("COMPOSITE")
public class JCRGalleryImpl extends BaseGalleryImpl implements Gallery {
    private static final Logger logger = Logger.getLogger(JCRGalleryImpl.class.getName());
    
    private JCRRepositoryManager repositoryManager;

    public JCRGalleryImpl() {

    }
    
    @Reference(name="repositoryManager")
    protected void setRepositoryManager(JCRRepositoryManager repositoryManager) {
        this.repositoryManager = repositoryManager;
    }

    public JCRGalleryImpl(String name) {
        super(name);
    }

    @Init
    public void init() {
        logger.info("Initializing JCR Gallery");
        try {
            URL galleryURL = this.getClass().getClassLoader().getResource(name);
            if (galleryURL == null) {
                // Accomodate for J2EE classpath that starts in WEB-INF\classes
                galleryURL = this.getClass().getClassLoader().getResource("../../" + name);
            }

            if (galleryURL != null) {
                File album = new File(galleryURL.toURI());
                if (album.isDirectory() && album.exists()) {
                    File[] albums = album.listFiles();
                    for (File albumFile : albums) {
                        if (!albumFile.getName().startsWith(".")) {
                            if (albumFile.isDirectory() && albumFile.exists()) {
                                Album newAlbum = JCRAlbumImpl.createAlbum(repositoryManager, albumFile.getName());
                                newAlbum.setName(albumFile.getName());
                                ((JCRAlbumImpl)newAlbum).setGallery(name);
                                this.albums.add(newAlbum);
                            }
                        }
                    }
                }
            }
            getAlbumsFromJcrRepository();
        } catch (Exception e) {
            // FIXME: ignore for now
            e.printStackTrace();
        }
        
        initialized = true;
    }
    
    private void getAlbumsFromJcrRepository() {
        try {
            Session session = repositoryManager.getSession();
            Node rootNode = session.getRootNode();
            NodeIterator albumNodes = rootNode.getNodes();
            while (albumNodes.hasNext()) {
                Node albumNode = albumNodes.nextNode();
                if (albumNode.getPath().equals("/jcr:system")) {
                    continue;
                }
                String albumName = albumNode.getName();
                Album album = JCRAlbumImpl.createAlbum(repositoryManager, albumName);
                if (!albums.contains(album)) {
                    albums.add(album);
                }
            }
        } catch (RepositoryException e) {
            e.printStackTrace();
        } finally {
            //repositoryManager.releaseSession();
        }
    }

    public void addAlbum(String albumName) {
        try {
            Session session = repositoryManager.getSession();
            Node rootNode = session.getRootNode();
            if (rootNode.hasNode(albumName)) {
                logger.info("This album is already in gallery");
                return;
            }
            // add album to the root
            rootNode.addNode(albumName);
            session.save();
            // add album to the list of albums
            Album album = JCRAlbumImpl.createAlbum(repositoryManager, albumName);
            if (!albums.contains(album)) {
                albums.add(album);
            }
        } catch (RepositoryException e) {
            e.printStackTrace();
        } finally {
            //repositoryManager.releaseSession();
        }
    }
}
