/* 
    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.wiki.providers;

import org.apache.wiki.WikiPage;
import org.apache.wiki.api.exceptions.ProviderException;
import org.apache.wiki.api.providers.WikiProvider;
import org.apache.wiki.search.QueryItem;
import org.apache.wiki.search.SearchResult;

import java.util.Collection;
import java.util.Date;
import java.util.List;


/**
 *  Each Wiki page provider should implement this interface.
 *  <P>
 *  You can build whatever page providers based on this, just leave the unused methods do something useful.
 *  <P>
 *  WikiPageProvider uses Strings and ints to refer to pages.  This may be a bit odd, since WikiAttachmentProviders all use Attachment
 *  instead of name/version.  We will perhaps modify these in the future.  In the mean time, name/version is quite sufficient.
 *  <P>
 *  FIXME: In reality we should have an AbstractWikiPageProvider, which would provide intelligent backups for subclasses.
 */
public interface WikiPageProvider extends WikiProvider {

    /**
     *  Attempts to save the page text for page "page".  Note that the provider creates a new version regardless of what the version
     *  parameter of the WikiPage is.
     *  
     *  @param page The WikiPage to save
     *  @param text The text to save.
     *  @throws ProviderException If something goes wrong.
     */
    void putPageText( WikiPage page, String text ) throws ProviderException;

    /**
     *  Return true, if page exists.
     *  
     *  @param page The page name.
     *  @return true, if the page exists; false otherwise.
     */
    boolean pageExists( String page );

    /**
     * Return true, if page with a particular version exists.
     *
     * @param page    The page name to check for
     * @param version The version to check
     * @return True, if page exists; false otherwise.
     */
    boolean pageExists( String page, int version );

    /**
     *  Finds pages based on the query.   Only applicable to providers which implement the FastSearch interface.  Otherwise JSPWiki
     *  will use its internal cache.
     *  <p>
     *  This method should really be a part of the FastSearch IF.
     *  
     *  @param query An array of QueryItems to match
     *  @return A Collection of WikiPages.
     */
    Collection< SearchResult > findPages( QueryItem[] query );

    /**
     *  Returns info about the page.
     *  
     *  @return A filled WikiPage.
     *  @param page The page name
     *  @param version The version number
     *  @throws ProviderException If something goes wrong.
     */
    WikiPage getPageInfo( String page, int version ) throws ProviderException;

    /**
     *  Returns all pages.  Each element in the returned Collection should be a WikiPage.
     *  
     *  @return A collection of WikiPages
     *  @throws ProviderException If something goes wrong.
     */
    Collection< WikiPage > getAllPages() throws ProviderException;

    /**
     *  Gets a list of recent changes.
     *  
     *  @param date The date to check from
     *  @return A Collection of WikiPages
     *  @since 1.6.4
     */
    Collection< WikiPage > getAllChangedSince( Date date );

    /**
     *  Gets the number of pages.
     *  
     *  @return The number of pages in the repository
     *  @throws ProviderException If something goes wrong
     *  @since 1.6.4
     */
    int getPageCount() throws ProviderException;

    /**
     *  Returns version history.  Each element should be a WikiPage.
     *
     *  @param page The name of the page to get the history from.
     *  @return A collection of WikiPages.
     *  @throws ProviderException If something goes wrong.
     */
    List< WikiPage > getVersionHistory( String page ) throws ProviderException;

    /**
     *  Gets a specific version out of the repository.
     *
     *  @param page Name of the page to fetch.
     *  @param version Version of the page to fetch.
     *  @return The content of the page, or null, if the page does not exist.
     *  @throws ProviderException If something goes wrong.
     */
    String getPageText( String page, int version ) throws ProviderException;

    /**
     *  Removes a specific version from the repository.  The implementations should really do no more security checks, since that is the
     *  domain of the PageManager.  Just delete it as efficiently as you can.
     *
     *  @since 2.0.17.
     *  @param pageName Name of the page to be removed.
     *  @param version  Version of the page to be removed.  May be LATEST_VERSION.
     *  @throws ProviderException If the page cannot be removed for some reason.
     */
    void deleteVersion( String pageName, int version ) throws ProviderException;

    /**
     *  Removes an entire page from the repository.  The implementations should really do no more security checks, since that is the domain
     *  of the PageManager.  Just delete it as efficiently as you can.  You should also delete any auxiliary files that belong to this page,
     *  IF they were created by this provider.
     *
     *  <P>The reason why this is named differently from deleteVersion() (logically, this method should be an overloaded version) is that
     *  I want to be absolutely sure I don't accidentally use the wrong method.  With overloading something like that happens sometimes...
     *
     *  @since 2.0.17.
     *  @param pageName Name of the page to be removed completely.
     *  @throws ProviderException If the page could not be removed for some reason.
     */
    void deletePage( String pageName ) throws ProviderException;

    /**
     * Move a page
     *
     * @param from  Name of the page to move.
     * @param to    New name of the page.
     * @throws ProviderException If the page could not be moved for some reason.
     */
    void movePage(String from, String to) throws ProviderException;

}