/*
 * iDescriptor: A free and open-source idevice management tool.
 *
 * Copyright (C) 2025 Uncore <https://github.com/uncor3>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
 */

#include "ifusemanager.h"
#include <QDebug>
#include <QProcess>

QStringList iFuseManager::getMountArg(std::string &udid, QString &path)
{
    return QStringList() << "-u" << QString::fromStdString(udid) << path;
}

#ifdef __linux__
QList<QString> iFuseManager::getMountPoints()
{
    QProcess mountProcess;
    mountProcess.start("mount", QStringList() << "-t"
                                              << "fuse.ifuse");
    mountProcess.waitForFinished();

    QString output = mountProcess.readAllStandardOutput();

    if (output.trimmed().isEmpty()) {
        qDebug() << "[iFuseWidget] No existing ifuse mounts found.";
        return {};
    }

    QStringList mountPoints;
    QStringList lines = output.split('\n', Qt::SkipEmptyParts);
    for (const QString &line : lines) {
        // A typical line is: "ifuse on /path/to/mount type fuse.ifuse (...)"
        QString mountPath = line.section(" on ", 1).section(" type ", 0, 0);
        if (!mountPath.isEmpty()) {
            qDebug() << "[iFuseWidget]   - Mount point:" << mountPath;
            mountPoints.append(mountPath);
        }
    }
    return mountPoints;
}
#endif

bool iFuseManager::linuxUnmount(const QString &path)
{
    QProcess umountProcess;
    umountProcess.start("fusermount", QStringList() << "-u" << path);
    umountProcess.waitForFinished();

    if (umountProcess.exitCode() != 0) {
        qWarning() << "[iFuseWidget] Failed to unmount" << path << ":"
                   << umountProcess.readAllStandardError().trimmed();
        return false;
    }

    qDebug() << "[iFuseWidget] Successfully unmounted" << path;
    return true;
}