/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Masatomo KOBAYASHI - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.ai.navigator.userinfo.impl;

import java.util.Iterator;

import org.eclipse.actf.ai.fennec.treemanager.ITreeItem;
import org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier;
import org.eclipse.actf.ai.navigator.userinfo.IUserInfoConstants;
import org.eclipse.actf.ai.navigator.userinfo.IUserInfoGenerator;
import org.eclipse.actf.ai.navigator.userinfo.IUserInfoGenerator.Result;
import org.eclipse.actf.ai.xmlstore.IXMLEditableInfo;
import org.eclipse.actf.ai.xmlstore.IXMLInfo;
import org.eclipse.actf.ai.xmlstore.IXMLSelector;
import org.eclipse.actf.ai.xmlstore.IXMLStore;
import org.eclipse.actf.ai.xmlstore.IXMLStoreService;
import org.eclipse.actf.ai.xmlstore.XMLStoreException;
import org.eclipse.actf.ai.xmlstore.XMLStoreServiceUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;




public class MetaDataModifier implements IUserInfoConstants, IMetaDataModifier {
    private IUserInfoGenerator generator;
    private ITreeItem item;
    private String text;
    private String site;
    private String pageTitle;
    
//    @Override
//    public String toString() {
//        StringBuffer ret = new StringBuffer();
//        String s = item.getUIString();
//        ret.append(generator);
//        ret.append(" : ");
//        ret.append(s != null && s.length() > 0 ? s : "X");
//        ret.append(" is ");
//        ret.append(text);
//        return ret.toString();
//    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#toString(org.eclipse.actf.ai.navigator.userinfo.IUserInfoConstants.Result)
     */
    public String toString(Result result) {
        return generator.toString(result);
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#commit(boolean)
     */
    public Result commit(boolean save) throws XMLStoreException {
        IXMLEditableInfo info = getUserInfo();
        info.setPageTitle(pageTitle);
        Result result = Result.NOTHING;
        if (generator != null) {
            if (item == null) return Result.ERROR;
            Document infoDocument = info.getRootNode().getOwnerDocument();
            Node parent = infoDocument.getElementsByTagNameNS(DEFAULT_NAMESPACE, "attach").item(0);
//            TargetNodeQuery paths = getQueryPaths(parent.getOwnerDocument());
//            result = generator.addUserInfo(parent, paths, text);
//            Node node = getInfoNode(parent);
            Node node = item.serializeQuery(parent);
            if (node == null) return Result.ERROR;
            result = generator.addUserInfo(node, text);
            if (!node.hasChildNodes())
                parent.removeChild(node);
        }
        if (save)
            info.save();
        return result;
    }
    
    private IXMLEditableInfo getUserInfo() throws XMLStoreException {
        IXMLStoreService service = XMLStoreServiceUtil.getXMLStoreService();
        IXMLEditableInfo info = getStoredUserInfo(service);
        if (info != null) {
            return info;
        } else {
            return createNewUserInfo(service);
        }
    }
    
    private IXMLEditableInfo getStoredUserInfo(IXMLStoreService service) {
        IXMLStore store0 = service.getRootStore();
        IXMLSelector sel1 = service.getSelectorWithDocElem("fennec", DEFAULT_NAMESPACE);
        IXMLStore store1 = store0.specify(sel1);
        if (store1 == null)
            return null;
        IXMLSelector sel2 = service.getSelectorWithURI(site);
        IXMLStore store2 = store1.specify(sel2);
        if (store2 == null)
            return null;
        for (Iterator<IXMLInfo> i = store2.getInfoIterator(); i.hasNext(); ) {
            IXMLInfo info = i.next();
            if (info.isUserEntry() && (info instanceof IXMLEditableInfo)) {
                //  System.out.println("open stored user info.");
                return (IXMLEditableInfo) info;
            }
        }
        return null;
    }
    
    private IXMLEditableInfo createNewUserInfo(IXMLStoreService service) throws XMLStoreException {
        IXMLEditableInfo info = service.newUserXML(DEFAULT_NAMESPACE, "fennec", site);
        info.setPageTitle(pageTitle);
        Node root = info.getRootNode();
        Document doc = root.getOwnerDocument();
        Element node = doc.createElementNS(DEFAULT_NAMESPACE, "attach");
        node.setAttributeNS(LOC_NAMESPACE, "loc:path", ".");
        root.appendChild(node);
        //System.out.println("create new user info.");
        return info;
    }
    
    public boolean remove() throws XMLStoreException {
        IXMLStoreService service = XMLStoreServiceUtil.getXMLStoreService();
        IXMLEditableInfo info = getStoredUserInfo(service);

        if (info == null) {
            return false;
        }
        info.remove();
        return true;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#getSite()
     */
    public String getSite() {
        return site;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#setSite(java.lang.String)
     */
    public void setSite(String targetSite) {
        this.site = targetSite;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#getItem()
     */
    public ITreeItem getItem() {
        return item;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#setItem(org.eclipse.actf.ai.fennec.treemanager.ITreeItem)
     */
    public void setItem(ITreeItem item) {
        this.item = item;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#getText()
     */
    public String getText() {
        return text;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#setText(java.lang.String)
     */
    public void setText(String text) {
        this.text = text;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#getGenerator()
     */
    public IUserInfoGenerator getGenerator() {
        return generator;
    }

    /* (non-Javadoc)
     * @see org.eclipse.actf.ai.navigator.userinfo.IMetaDataModifier#setGenerator(org.eclipse.actf.ai.navigator.userinfo.IUserInfoGenerator)
     */
    public void setGenerator(IUserInfoGenerator generator) {
        this.generator = generator;
    }
    
    public void setPageTitle(String pageTitle) {
        this.pageTitle = pageTitle;
    }
}

