/***************************************************************************
 * Copyright (C) 2015-2016 by Savoir-faire Linux                                *
 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
 *                                                                         *
 * 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/>.   *
 **************************************************************************/

#include "contactpicker.h"
#include "ui_contactpicker.h"



#include "categorizedcontactmodel.h"
#include "personmodel.h"

#include "utils.h"

ContactPicker::ContactPicker(ContactMethod *number, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ContactPicker),
    personSelected_(nullptr),
    number_(number)
{
    ui->setupUi(this);

    this->setWindowFlags(Qt::CustomizeWindowHint);
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);

    contactProxyModel_ = new OnlyPersonProxyModel(&PersonModel::instance());
    contactProxyModel_->setSortRole(static_cast<int>(Qt::DisplayRole));
    contactProxyModel_->sort(0,Qt::AscendingOrder);
    contactProxyModel_->setFilterRole(Qt::DisplayRole);

    ui->contactView->setModel(contactProxyModel_);
    ui->numberLineEdit->setText(number->uri());
}

ContactPicker::~ContactPicker()
{
    delete ui;
}

void
ContactPicker::on_contactView_doubleClicked(const QModelIndex &index)
{
    Q_UNUSED(index)
    this->accept();
}

void
ContactPicker::accept()
{
    /* Force LRC to update contact model as adding a number
    to a contact without one didn't render him reachable */
    CategorizedContactModel::instance().setUnreachableHidden(false);

    auto idx = ui->contactView->currentIndex();

    //There is only one collection on Windows
    auto personCollection = PersonModel::instance().collections().at(0);

    if (not ui->nameLineEdit->text().isEmpty()) {
        auto *newPerson = new Person();
        newPerson->setFormattedName(ui->nameLineEdit->text());
        Person::ContactMethods cM;
        cM.append(number_);
        newPerson->setContactMethods(cM);
        newPerson->setUid(Utils::GenGUID().toLocal8Bit());
        PersonModel::instance().addNewPerson(newPerson, personCollection);
    } else if (idx.isValid()) {
        auto p = idx.data(static_cast<int>(Person::Role::Object)).value<Person*>();
        Person::ContactMethods cM (p->phoneNumbers());
        cM.append(number_);
        p->setContactMethods(cM);
        p->save();
    }
    CategorizedContactModel::instance().setUnreachableHidden(true);

    QDialog::accept();
}

void
ContactPicker::on_okButton_clicked()
{
    this->accept();
}

void
ContactPicker::on_createNewButton_clicked()
{
    ui->stackedWidget->setCurrentIndex(1);
}

void
ContactPicker::on_searchBar_textChanged(const QString &arg1)
{
    contactProxyModel_->setFilterRegExp(QRegExp(arg1, Qt::CaseInsensitive, QRegExp::FixedString));
}
