package ftp_client;

import java.io.File;

// Fichier virtuel associé à un fichier FTP, herite de File
public class FTPFile extends File {
	
	/* File need it */
	// Un fichier a besoin d'etre serializable
	private static final long serialVersionUID = 1L;
	
	/* Variables */
	// Est-ce un dossier ou non
	private boolean	_isDirectory;
	public boolean isDirectory(){ return _isDirectory; }
	
	// Nom du fichier
	private String	name;
    public String getName(){ return name; }
    public void setName(String name){ this.name = name; }
    
    // Chemin du fichier
    private String	path;
    public String getAbsolutePath(){ return path+name; }
    public String getParentPath(){ return path; }
    
    // Taille du fichier
    private long		size;
    public long	length(){ return size; }
    
    // Lien (pas utilise)
    public String	links;
    
    // Date de modification sous forme de chaine de caractere
    private String  date;
    public String getDate(){ return date; }
    
    // Permission du fichier
    public Permission  permission;
    
    // Possesseur du fichier et groupe possesseur
    private String	owner;    
    private String	group;
    public String getOwnerGroup(){ return owner +" ("+group+")"; }
    
	/* Base FTP */
    // Le fichier provient de ce FTP
    FTP ftp;

	/* Constructor */
    // Constructeur recevant la connexion FTP d'origine, la ligne de la connexion de donnees et le chemin d'acces
	public FTPFile(FTP ftp, String ftp_list_string, String path) throws Exception{
		super("virtual_ftp_file"); // Nom de fichier arbitraire
		try {
			this.ftp = ftp;
			
			// On rend "plus jolie" le chemin d'acces
			this.path = path;
			if(this.path!=null){
				while(this.path.contains("//")) this.path = this.path.replace("//", "/");
				if(!this.path.endsWith("/")) this.path += "/";
			}
			
			// Parsing de la ligne du serveur de donnees
			MStringTokenizer tk = new MStringTokenizer(ftp_list_string, " ");
			String tmp  = tk.nextToken();
			_isDirectory = (tmp.charAt(0)=='d'); // Si la chaine commence par un 'd', alors c'est un dossier
			permission  = new Permission(tmp.substring(1)); // On cree un objet Permission avec les permissions du fichier
			links	= tk.nextToken(); // On recupere les liens...
			owner	= tk.nextToken(); // ..., l'utilisateur...
			group	= tk.nextToken(); // ..., le groupe...
			size 	= Long.parseLong(tk.nextToken()); // ..., la taille du fichier...
			date	= tk.nextToken()+ " " + tk.nextToken() + " " + tk.nextToken(); // ..., la date de modification...
			name	= tk.getRemainingText(); // ..., puis le nom du fichier (tout le reste du texte)
			name	= name.replace("/", "").replace("\"", ""); // On retire les probables '/' et '"' dans le nom du fichier
			// nextToken() n'aurait pas suffit pour le nom du fichier, car le nom du fichier peut contenir des espaces.
			
		}catch(Exception e){throw new Exception("LIST - Erreur de parsing"); } // En cas d'exception, renvoyer une exception plus globale
	}
	
	/* Delete override */
	// Remplace la fonction delete d'origine de File
	public boolean delete(){
		return ftp.delete(this);
	}
	
	/* Rename override */
	// Remplace la fonction renameTo d'origine de File
	public boolean renameTo(File fileDest){
		return ftp.rename(this, fileDest.getName());
	}
	
	/* toString() */
	// FTPFile.toString()
	public String toString(){
		return (this.path!=null?this.path:"")+this.name;
	}
}
