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

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "tripgroupinfoprovider.h"
0008 
0009 #include "locationinformation.h"
0010 #include "reservationmanager.h"
0011 #include "tripgroup.h"
0012 
0013 #include "weatherforecast.h"
0014 #include "weatherforecastmanager.h"
0015 
0016 #include <KItinerary/LocationUtil>
0017 #include <KItinerary/Place>
0018 #include <KItinerary/SortUtil>
0019 
0020 #include <KCountry>
0021 
0022 #include <QDateTime>
0023 #include <QDebug>
0024 
0025 using namespace KItinerary;
0026 
0027 static GeoCoordinates geoCoordinate(const QVariant &res)
0028 {
0029     if (LocationUtil::isLocationChange(res)) {
0030         return LocationUtil::geo(LocationUtil::arrivalLocation(res));
0031     }
0032     return LocationUtil::geo(LocationUtil::location(res));
0033 }
0034 
0035 TripGroupInfoProvider::TripGroupInfoProvider() = default;
0036 TripGroupInfoProvider::~TripGroupInfoProvider() = default;
0037 
0038 void TripGroupInfoProvider::setReservationManager(ReservationManager *resMgr)
0039 {
0040     m_resMgr = resMgr;
0041 }
0042 
0043 void TripGroupInfoProvider::setWeatherForecastManager(WeatherForecastManager *mgr)
0044 {
0045     m_weatherMgr = mgr;
0046 }
0047 
0048 WeatherForecast TripGroupInfoProvider::weatherForecast(const TripGroup &group) const
0049 {
0050     WeatherForecast fc;
0051     if (!m_weatherMgr->allowNetworkAccess()) {
0052         return fc;
0053     }
0054 
0055     const auto elems = group.elements();
0056     QVariant startRes;
0057     QDateTime lastEndTime = group.beginDateTime();
0058 
0059     for (const auto &resId : elems) {
0060         const auto res = m_resMgr->reservation(resId);
0061         const auto newGeo = geoCoordinate(res);
0062         if (!newGeo.isValid()) {
0063             continue;
0064         }
0065         if (startRes.isValid()) {
0066             const auto geo = geoCoordinate(startRes);
0067             const auto startDt = LocationUtil::isLocationChange(startRes) ? SortUtil::endDateTime(startRes) : lastEndTime;
0068             const auto endDt = SortUtil::startDateTime(res);
0069             if (geo.isValid() && startDt.isValid() && endDt.isValid()) {
0070                 const auto newFc = m_weatherMgr->forecast(geo.latitude(), geo.longitude(), startDt, endDt);
0071                 if (!fc.isValid() && newFc.isValid()) {
0072                     fc.setDateTime(startDt);
0073                     fc.setRange(std::numeric_limits<int>::max()); // always consider the sub-range forecast during merging
0074                 }
0075                 fc.merge(newFc);
0076             }
0077             lastEndTime = endDt;
0078         }
0079         startRes = res;
0080     }
0081 
0082     return fc;
0083 }
0084 
0085 QVariantList TripGroupInfoProvider::locationInformation(const TripGroup &group, const QString &homeCountryIsoCode) const
0086 {
0087     QVariantList l;
0088 
0089     const auto elems = group.elements();
0090     for (const auto &resId : elems) {
0091         const auto res = m_resMgr->reservation(resId);
0092         if (!LocationUtil::isLocationChange(res)) {
0093             continue;
0094         }
0095 
0096         const auto destCountry = LocationUtil::address(LocationUtil::arrivalLocation(res)).addressCountry();
0097         if (destCountry.isEmpty() || destCountry == homeCountryIsoCode) {
0098             continue;
0099         }
0100         if (std::any_of(l.constBegin(), l.constEnd(), [destCountry](const QVariant &v) { return v.value<LocationInformation>().isoCode() == destCountry; })) {
0101             continue;
0102         }
0103 
0104         LocationInformation info;
0105         info.setIsoCode(homeCountryIsoCode);
0106         info.setIsoCode(destCountry);
0107         if (info.powerPlugCompatibility() != LocationInformation::FullyCompatible) {
0108             l.push_back(QVariant::fromValue(info));
0109         }
0110     }
0111 
0112     return l;
0113 }
0114 
0115 QStringList TripGroupInfoProvider::currencies(const TripGroup& group, const QString &homeCurrency) const
0116 {
0117     QStringList l;
0118     const auto elems = group.elements();
0119     for (const auto &resId : elems) {
0120         const auto res = m_resMgr->reservation(resId);
0121         if (!LocationUtil::isLocationChange(res)) {
0122             continue;
0123         }
0124 
0125         const auto destCountry = LocationUtil::address(LocationUtil::arrivalLocation(res)).addressCountry();
0126         const auto currency = KCountry::fromAlpha2(destCountry).currencyCode();
0127         if (currency.isEmpty() || currency == homeCurrency || l.contains(currency)) {
0128             continue;
0129         }
0130         l.push_back(currency);
0131     }
0132 
0133     return l;
0134 }
0135 
0136 #include "moc_tripgroupinfoprovider.cpp"