File indexing completed on 2025-02-02 05:02:38

0001 /*
0002     SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "tripgroup.h"
0008 
0009 #include "jsonio.h"
0010 #include "logging.h"
0011 #include "reservationmanager.h"
0012 #include "tripgroupmanager.h"
0013 #include "transfer.h"
0014 #include "transfermanager.h"
0015 
0016 #include <KItinerary/SortUtil>
0017 
0018 #include <QDateTime>
0019 #include <QDebug>
0020 #include <QFile>
0021 #include <QJsonArray>
0022 #include <QJsonObject>
0023 
0024 TripGroup::TripGroup() = default;
0025 
0026 TripGroup::TripGroup(TripGroupManager *mgr)
0027     : m_mgr(mgr)
0028 {
0029 }
0030 
0031 TripGroup::~TripGroup() = default;
0032 
0033 QString TripGroup::name() const
0034 {
0035     return m_name;
0036 }
0037 
0038 void TripGroup::setName(const QString &name)
0039 {
0040     m_name = name;
0041 }
0042 
0043 QVector<QString> TripGroup::elements() const
0044 {
0045     return m_elements;
0046 }
0047 
0048 void TripGroup::setElements(const QVector<QString> &elems)
0049 {
0050     m_elements = elems;
0051 }
0052 
0053 bool TripGroup::load(const QString &path)
0054 {
0055     QFile f(path);
0056     if (!f.open(QFile::ReadOnly)) {
0057         qCWarning(Log) << "Failed to open trip group file:" << path << f.errorString();
0058         return false;
0059     }
0060 
0061     const auto obj = JsonIO::read(f.readAll()).toObject();
0062     m_name = obj.value(QLatin1StringView("name")).toString();
0063     const auto elems = obj.value(QLatin1StringView("elements")).toArray();
0064     m_elements.clear();
0065     m_elements.reserve(elems.size());
0066     for (const auto &v : elems) {
0067         m_elements.push_back(v.toString());
0068     }
0069 
0070     return elems.size() >= 2;
0071 }
0072 
0073 void TripGroup::store(const QString &path) const
0074 {
0075     QFile f(path);
0076     if (!f.open(QFile::WriteOnly)) {
0077         qCWarning(Log) << "Failed to open trip group file:" << path << f.errorString();
0078         return;
0079     }
0080 
0081     QJsonObject obj;
0082     obj.insert(QLatin1StringView("name"), m_name);
0083     QJsonArray elems;
0084     std::copy(m_elements.begin(), m_elements.end(), std::back_inserter(elems));
0085     obj.insert(QLatin1StringView("elements"), elems);
0086     f.write(JsonIO::write(obj));
0087 }
0088 
0089 QDateTime TripGroup::beginDateTime() const
0090 {
0091     if (m_elements.empty()) {
0092         return {};
0093     }
0094     const auto res = m_mgr->m_resMgr->reservation(m_elements.at(0));
0095     const auto dt = KItinerary::SortUtil::startDateTime(res);
0096 
0097     const auto transfer = m_mgr->m_transferMgr ? m_mgr->m_transferMgr->transfer(m_elements.at(0), Transfer::Before) : Transfer();
0098     if (transfer.state() == Transfer::Selected && transfer.journey().scheduledDepartureTime().isValid()) {
0099         return std::min(dt, transfer.journey().scheduledDepartureTime());
0100     }
0101     return dt;
0102 }
0103 
0104 QDateTime TripGroup::endDateTime() const
0105 {
0106     if (m_elements.empty()) {
0107         return {};
0108     }
0109     const auto res = m_mgr->m_resMgr->reservation(m_elements.constLast());
0110     const auto dt = KItinerary::SortUtil::endDateTime(res);
0111 
0112     const auto transfer = m_mgr->m_transferMgr ? m_mgr->m_transferMgr->transfer(m_elements.constLast(), Transfer::After) : Transfer();
0113     if (transfer.state() == Transfer::Selected && transfer.journey().scheduledArrivalTime().isValid()) {
0114         return std::max(dt, transfer.journey().scheduledArrivalTime());
0115     }
0116     return dt;
0117 }
0118 
0119 #include "moc_tripgroup.cpp"