# -*- coding: utf-8 -*-
# Modul zur Erkennung des MIME-Types des Elements. 
import mimetypes, shutil, os.path

class DateiSystemElement(object):
    """Die Klasse DateiSystemElement stellt die Basisklasse für Elemente
    im Dateisystem (z.B. Dateien und Verzeichnisse) dar.   
    
    Anmerkungen: 
        - Eigentlich sollte ein DateiSystemElement seinen eigenen Pfad nicht
          kennen. Auch das Umbenennen und weitere Verwaltungsfunktionen gehören
          eher zum übergeordneten Dateisystem. Aus praktikabilitätsgründen
          wurde allerdings diese Implementierung gewählt.
        - Für die Erkennung des MIME-Types wird derzeit lediglich die
          Erweiterung des Elements berücksichtigt.
    
    Attribute:
        name (Zeichenkette): Der Name des Elements im Dateisystem.
        pfad (Zeichenkette): Der Pfad des Elements im Dateisystem.
        typ (Zeichenkette): Gibt den MIME-Type des Elements an.
        verzeichnis (Zeichenkette): Der Pfad des übergeordneten Verzeichnisses
            der Datei.
    """
    
    def __init__(self, pPfad):
        """Konstruktor. Initialisiert das DateiSystemElement.
        
        Parameter: 
            pPfad (Zeichenkette): Der Pfad des DateiSystemElements.
        """
        # Slash am Ende entfernen
        if pPfad.endswith('/'):
            pPfad = pPfad[:-1]
            
        self._pfad = pPfad
        self._erkenneTyp()
        
    def _erkenneTyp(self):
        """Hilfsmethode. Erkennt den Typ des DateiSystemElements und speichert.
        diesen im Attribut 'typ'.
        """
        if os.path.isfile(self._pfad):
            # Erkennung des MIME-Types. Es wird lediglich die Erweiterung
            # der Datei geprüft.
            self.typ = mimetypes.guess_type(self._pfad, False)
        elif os.path.isdir(self._pfad):
            self.typ = "inode/directory"
        elif os.path.islink(self._pfad):
            self.typ = "inode/symlink"
        elif os.path.ismount(self._pfad):
            self.typ = "inode/mount-point"
        else:
            self.typ = "application/octet-stream"
    
    def istVorhanden(self):
        """Anfrage. Prüft, ob das Element im Dateisystem bereits existiert.        
        
        Parameter:
            --- keine ---
        
        Rückgabe (Wahrheitswert): True falls das Element im Dateisystem bereits
            existiert, sonst False. 
        """
        return os.path.exists(self._pfad)
    
    def nennePfad(self):
        """Anfrage. Gibt den Pfad des Elements im Dateisystem zurück."""
        return self._pfad
        
    def nenneVerzeichnis(self):
        """Anfrage. Gibt das übergeordnete Verzeichnis des Elements zurück."""
        return os.path.dirname(self._pfad)
    
    def nenneName(self):
        """Anfrage. Gibt den Namen des Elements im Dateisystem zurück."""
        return os.path.basename(self._pfad)
        
    def nenneTyp(self):
        """Anfrage. Gibt den Typ des Elements zurück (als MIME-Type)."""
        return self.typ
    
    def verschieben(pPfad):
        """Auftrag. Hängt das Element im Dateisystem um. 
        
        Parameter:
            pPfad (Zeichenkette): Gibt den neuen Pfad im Dateisystem an.
        """
        # Verschieben, falls Element bereits existiert.
        if os.path.exists(pPfad):
            try:
                shutil.move(self._pfad, pPfad)
                self._pfad = pPfad
            except:
                print("Fehler. Verschieben von '%s' nicht möglich." % self._pfad)
         
    # Attribute (verdeckte Getter und Setter)
    pfad = property(nennePfad, verschieben, doc="Der Pfad des " \
        "DateiSystemElements im Dateisystem.")
    name = property(nenneName, doc="Der Name des DateiSystemElements im" \
        "Dateisystem.")
    verzeichnis = property(nenneVerzeichnis, doc="Der Pfad des übergeordneten" \
        " Verzeichnisses des DateiSystemElements im Dateisystem.")