/*
 * Squawk messenger.
 * Copyright (C) 2019  Yury Gubich <blue@macaw.me>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU 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 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 "vcard.h"
#include "keyinfo.h"
#include "enums.h"

#include <list>

namespace Shared {
/**
 * This class should contain all nessesary data to display
 * roster element info (contact, or out of roster contact, or MUC, or MIX in the future)
 *
 * under development yet
 */
class Info {
public:
    Info ();
    Info (const QString& address, EntryType = EntryType::none);
    Info (const Info& other);
    Info (Info&& other);
    virtual ~Info ();

    Info& operator = (const Info& other);
    Info& operator = (Info&& other);
    QString getAddress () const;
    const QString& getAddressRef () const;
    void setAddress (const QString& address);
    EntryType getType () const;
    void turnIntoNone ();
    void turnIntoContact (const VCard& card = VCard(), const std::list<KeyInfo>& activeKeys = {}, const std::list<KeyInfo>& inactiveKeys = {});
    void turnIntoContact (VCard* card = new VCard, std::list<KeyInfo>* activeKeys = new std::list<KeyInfo>, std::list<KeyInfo>* inactiveKeys = new std::list<KeyInfo>);
    void turnIntoOwnAccount (const VCard& card = VCard(), const std::list<KeyInfo>& activeKeys = {}, const std::list<KeyInfo>& inactiveKeys = {});
    void turnIntoOwnAccount (VCard* card = new VCard, std::list<KeyInfo>* activeKeys = new std::list<KeyInfo>, std::list<KeyInfo>* inactiveKeys = new std::list<KeyInfo>);
    const VCard& getVCardRef () const;
    VCard& getVCardRef ();
    const VCard* getVCard () const;
    VCard* getVCard ();
    void setVCard (Shared::VCard* card);
    const std::list<KeyInfo>& getActiveKeysRef () const;
    std::list<KeyInfo>& getActiveKeysRef ();
    const std::list<KeyInfo>* getActiveKeys () const;
    std::list<KeyInfo>* getActiveKeys ();
    void setActiveKeys (std::list<KeyInfo>* keys);
    const std::list<KeyInfo>& getInactiveKeysRef () const;
    std::list<KeyInfo>& getInactiveKeysRef ();
    const std::list<KeyInfo>* getInactiveKeys () const;
    std::list<KeyInfo>* getInactiveKeys ();

private:
    EntryType type;
    QString address;
    VCard* vcard;
    std::list<KeyInfo>* activeKeys;
    std::list<KeyInfo>* inactiveKeys;
};
}