module;
#include <string_view>

export module splitFile;
using namespace std::string_view_literals;

// Klasse zum Zerlegen eines vollständigen Pfads in Laufwerk,
// Verzeichnis und Dateiname
export class SplitFullPath
{
    std::string_view drive;      // Laufwerk
    std::string_view path;       // Pfad
    std::string_view filename;   // Dateiname
public:
    // ctor
    SplitFullPath(std::string_view fullPath);
    // Memberfunktionen zum Auslesen der einzelnen Pfad-Elemente
    std::string_view GetDrive() const;
    std::string_view GetPath() const;
    std::string_view GetFilename() const;
};
// Konstruktor
// Teilt den uebergebenen Pfad in Laufwerk,
// Verzeichnis und Dateinamen auf
SplitFullPath::SplitFullPath(std::string_view fullPath)
{
    // Suche nach :
    auto pos = fullPath.find(':');
    // Falls gefunden
    if (pos != std::string_view::npos)
    {
        // string_view auf Laufwerk
        drive = fullPath.substr(0, pos + 1);
    }

    // Suche nach erstem /
    if (pos = fullPath.find('/'); pos != std::string_view::npos)
    {
        // Suche nach letzten / im String
        // Falls mehr als ein / im String vorhanden ist
        if (auto lastPos = fullPath.rfind('/'); lastPos != pos)
        {
            // Verzeichnisname geht vom erstem / bis letztem /
            path = fullPath.substr(pos, lastPos - 2);
            // Dateinamen ab endPos kopieren
            filename = fullPath.substr(lastPos + 1);
        }
        else
        {
            // Nur ein / im String, dann liegt Datei im Root-Verzeichnis
            filename = fullPath.substr(pos + 1);
            path = "/"sv;
        }
    }
    else
    {
        // kein / im String vorhanden, dann auch kein Verzeichnis
        // Wenn Laufwerk vorhanden
        if (!drive.empty())
            filename = fullPath.substr(2);
        else
            filename = fullPath;
    }
}

// Laufwerk zurückliefern
inline std::string_view SplitFullPath::GetDrive() const
{
    return drive;
}
// Pfad zurückliefern
inline std::string_view SplitFullPath::GetPath() const
{
    return path;
}
// Dateiname zurückliefern
inline std::string_view SplitFullPath::GetFilename() const
{
    return filename;
}
