/*
 * 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.ftpserver.ftplet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * This is the file abstraction used by the server.
 *
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public interface FtpFile {

    /**
     * Get the full path from the base directory of the FileSystemView.
     * @return a path where the path separator is '/' (even if the operating system
     *     uses another character as path separator).
     */
    String getAbsolutePath();

    /**
     * Get the file name of the file.
     * @return the last part of the file path (the part after the last '/').
     */
    String getName();

    /**
     * Is the file hidden?
     * @return true if the {@link FtpFile} is hidden
     */
    boolean isHidden();

    /**
     * Is it a directory?
     * @return true if the {@link FtpFile} is a directory
     */
    boolean isDirectory();

    /**
     * Is it a file?
     * @return true if the {@link FtpFile} is a file, false if it is a directory
     */
    boolean isFile();

    /**
     * Does this file exists?
     * @return true if the {@link FtpFile} exists
     */
    boolean doesExist();

    /**
     * Has read permission?
     * @return true if the {@link FtpFile} is readable by the user
     */
    boolean isReadable();

    /**
     * Has write permission?
     * @return true if the {@link FtpFile} is writable by the user
     */
    boolean isWritable();

    /**
     * Has delete permission?
     * @return true if the {@link FtpFile} is removable by the user
     */
    boolean isRemovable();

    /**
     * Get the owner name.
     * @return The name of the owner of the {@link FtpFile}
     */
    String getOwnerName();

    /**
     * Get owner group name.
     * @return The name of the group that owns the {@link FtpFile}
     */
    String getGroupName();

    /**
     * Get link count.
     * @return The number of links for the {@link FtpFile}
     */
    int getLinkCount();

    /**
     * Get last modified time in UTC.
     * @return The timestamp of the last modified time for the {@link FtpFile}
     */
    long getLastModified();

    /**
     * Set the last modified time stamp of a file.
     * @param time The last modified time, in milliseconds since the epoch. See {@link File#setLastModified(long)}.
     * @return <code>true</code> if and only if the operation succeeded; <code>false</code> otherwise
     */
    boolean setLastModified(long time);

    /**
     * Get file size.
     * @return The size of the {@link FtpFile} in bytes
     */
    long getSize();

    /**
     * Returns the physical location or path of the file. It is completely up to
     * the implementation to return appropriate value based on the file system
     * implementation.
     *
     * @return the physical location or path of the file.
     */
    Object getPhysicalFile();

    /**
     * Create directory.
     * @return true if the operation was successful
     */
    boolean mkdir();

    /**
     * Delete file.
     * @return true if the operation was successful
     */
    boolean delete();

    /**
     * Move file.
     * @param destination The target {@link FtpFile} to move the current {@link FtpFile} to
     * @return true if the operation was successful
     */
    boolean move(FtpFile destination);

    /**
     * List file objects. If not a directory or does not exist, null will be
     * returned. Files must be returned in alphabetical order.
     * List must be immutable.
     * @return The {@link List} of {@link FtpFile}s
     */
    List<? extends FtpFile> listFiles();

    /**
     * Create output stream for writing.
     * @param offset The number of bytes at where to start writing.
     *      If the file is not random accessible,
     *      any offset other than zero will throw an exception.
     * @return An {@link OutputStream} used to write to the {@link FtpFile}
     * @throws IOException
     */
    OutputStream createOutputStream(long offset) throws IOException;

    /**
     * Create input stream for reading.
     * @param offset The number of bytes of where to start reading.
     *          If the file is not random accessible,
     *          any offset other than zero will throw an exception.
     * @return An {@link InputStream} used to read the {@link FtpFile}
     * @throws IOException
     */
    InputStream createInputStream(long offset) throws IOException;
}
