/****************************************************************************
 *    Copyright (C) 2017-2020 Savoir-faire Linux Inc.                             *
 *   Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>           *
 *   Author : Alexandre Lision <alexandre.lision@savoirfairelinux.com>      *
 *                                                                          *
 *   This library is free software; you can redistribute it and/or          *
 *   modify it under the terms of the GNU Lesser General Public             *
 *   License as published by the Free Software Foundation; either           *
 *   version 2.1 of the License, or (at your option) any later version.     *
 *                                                                          *
 *   This library 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      *
 *   Lesser General Public License for more details.                        *
 *                                                                          *
 *   You should have received a copy of the GNU General Public License      *
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
 ***************************************************************************/
#pragma once

#include <string>
#include <string_view>
#include <map>

#include "string_utils.h"

namespace vCard {

constexpr static const char* PROFILE_VCF = "x-jami/jami.profile.vcard";

struct Delimiter
{
    constexpr static const char* SEPARATOR_TOKEN = ";";
    constexpr static const char* END_LINE_TOKEN = "\n";
    constexpr static const char* BEGIN_TOKEN = "BEGIN:VCARD";
    constexpr static const char* END_TOKEN = "END:VCARD";
};

struct Property
{
    constexpr static const char* UID = "UID";
    constexpr static const char* VCARD_VERSION = "VERSION";
    constexpr static const char* ADDRESS = "ADR";
    constexpr static const char* AGENT = "AGENT";
    constexpr static const char* BIRTHDAY = "BDAY";
    constexpr static const char* CATEGORIES = "CATEGORIES";
    constexpr static const char* CLASS = "CLASS";
    constexpr static const char* DELIVERY_LABEL = "LABEL";
    constexpr static const char* EMAIL = "EMAIL";
    constexpr static const char* FORMATTED_NAME = "FN";
    constexpr static const char* GEOGRAPHIC_POSITION = "GEO";
    constexpr static const char* KEY = "KEY";
    constexpr static const char* LOGO = "LOGO";
    constexpr static const char* MAILER = "MAILER";
    constexpr static const char* NAME = "N";
    constexpr static const char* NICKNAME = "NICKNAME";
    constexpr static const char* DESCRIPTION = "DESCRIPTION";
    constexpr static const char* NOTE = "NOTE";
    constexpr static const char* ORGANIZATION = "ORG";
    constexpr static const char* PHOTO = "PHOTO";
    constexpr static const char* PRODUCT_IDENTIFIER = "PRODID";
    constexpr static const char* REVISION = "REV";
    constexpr static const char* ROLE = "ROLE";
    constexpr static const char* SORT_STRING = "SORT-STRING";
    constexpr static const char* SOUND = "SOUND";
    constexpr static const char* TELEPHONE = "TEL";
    constexpr static const char* TIME_ZONE = "TZ";
    constexpr static const char* TITLE = "TITLE";
    constexpr static const char* URL = "URL";
    constexpr static const char* BASE64 = "ENCODING=BASE64";
    constexpr static const char* TYPE_PNG = "TYPE=PNG";
    constexpr static const char* TYPE_JPEG = "TYPE=JPEG";
    constexpr static const char* PHOTO_PNG = "PHOTO;ENCODING=BASE64;TYPE=PNG";
    constexpr static const char* PHOTO_JPEG = "PHOTO;ENCODING=BASE64;TYPE=JPEG";

    constexpr static const char* X_RINGACCOUNT = "X-RINGACCOUNTID";
};

namespace utils {
/**
 * Payload to vCard
 * @param content payload
 * @return the vCard representation
 */
static std::map<std::string, std::string>
toMap(std::string_view content)
{
    std::map<std::string, std::string> vCard;

    std::string_view line;
    while (jami::getline(content, line)) {
        if (line.size()) {
            const auto dblptPos = line.find(':');
            if (dblptPos == std::string::npos)
                continue;
            vCard.emplace(line.substr(0, dblptPos), line.substr(dblptPos + 1));
        }
    }
    return vCard;
}
} // namespace utils

} // namespace vCard
