/*
 * Copyright (c) 2012 Tobias Markmann
 * Licensed under the simplified BSD license.
 * See Documentation/Licenses/BSD-simplified.txt for more information.
 */

#include "QtVCardAddressField.h"

#include <QGridLayout>

#include <Swift/QtUI/QtSwiftUtil.h>

namespace Swift {

QtVCardAddressField::QtVCardAddressField(QWidget* parent, QGridLayout *layout, bool editable) :
	QtVCardGeneralField(parent, layout, editable, layout->rowCount(), tr("Address")) {
	connect(this, SIGNAL(editableChanged(bool)), SLOT(handleEditibleChanged(bool)));
}

QtVCardAddressField::~QtVCardAddressField() {
	disconnect(this, SLOT(handleEditibleChanged(bool)));
}

void QtVCardAddressField::setupContentWidgets() {
	textFieldGridLayout = new QGridLayout();

	streetLineEdit = new QtResizableLineEdit(this);
	textFieldGridLayout->addWidget(streetLineEdit, 0, 0, Qt::AlignVCenter);

	poboxLineEdit = new QtResizableLineEdit(this);
	textFieldGridLayout->addWidget(poboxLineEdit, 0, 1, Qt::AlignVCenter);

	addressextLineEdit = new QtResizableLineEdit(this);
	textFieldGridLayout->addWidget(addressextLineEdit, 1, 0, Qt::AlignVCenter);

	cityLineEdit = new QtResizableLineEdit(this);
	textFieldGridLayout->addWidget(cityLineEdit, 2, 0, Qt::AlignVCenter);

	pocodeLineEdit = new QtResizableLineEdit(this);
	textFieldGridLayout->addWidget(pocodeLineEdit, 2, 1, Qt::AlignVCenter);

	regionLineEdit = new QtResizableLineEdit(this);
	textFieldGridLayout->addWidget(regionLineEdit, 3, 0, Qt::AlignVCenter);

	countryLineEdit = new QtResizableLineEdit(this);
	textFieldGridLayout->addWidget(countryLineEdit, 4, 0, Qt::AlignVCenter);
	textFieldGridLayout->setVerticalSpacing(2);
	getGridLayout()->addLayout(textFieldGridLayout, getGridLayout()->rowCount()-1, 2, 5, 2, Qt::AlignVCenter);
	textFieldGridLayoutItem = getGridLayout()->itemAtPosition(getGridLayout()->rowCount()-1, 2);

#if QT_VERSION >= 0x040700
	streetLineEdit->setPlaceholderText(tr("Street"));
	poboxLineEdit->setPlaceholderText(tr("PO Box"));
	addressextLineEdit->setPlaceholderText(tr("Address Extension"));
	cityLineEdit->setPlaceholderText(tr("City"));
	pocodeLineEdit->setPlaceholderText(tr("Postal Code"));
	regionLineEdit->setPlaceholderText(tr("Region"));
	countryLineEdit->setPlaceholderText(tr("Country"));
#endif

	deliveryTypeLabel = new QLabel(this);
	deliveryTypeLabel->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard);
	getGridLayout()->addWidget(deliveryTypeLabel, getGridLayout()->rowCount()-3, 4, Qt::AlignVCenter);

	domesticRadioButton = new QRadioButton(tr("Domestic Delivery"), this);
	getGridLayout()->addWidget(domesticRadioButton, getGridLayout()->rowCount()-2, 4, Qt::AlignVCenter);

	internationalRadioButton = new QRadioButton(tr("International Delivery"), this);
	getGridLayout()->addWidget(internationalRadioButton, getGridLayout()->rowCount()-1, 4, Qt::AlignVCenter);

	buttonGroup = new QButtonGroup(this);
	buttonGroup->addButton(domesticRadioButton);
	buttonGroup->addButton(internationalRadioButton);

	setTabOrder(internationalRadioButton, getTagComboBox());
	getTagComboBox()->addTag("postal", tr("Postal"));
	getTagComboBox()->addTag("parcel", tr("Parcel"));

	QtVCardHomeWork::setTagComboBox(getTagComboBox());

	textFields << streetLineEdit << poboxLineEdit << addressextLineEdit << cityLineEdit << pocodeLineEdit << regionLineEdit << countryLineEdit;
	childWidgets << deliveryTypeLabel << domesticRadioButton << internationalRadioButton;
}

void QtVCardAddressField::customCleanup() {
	foreach(QWidget* widget, textFields) {
		widget->hide();
		textFieldGridLayout->removeWidget(widget);
	}
	getGridLayout()->removeItem(textFieldGridLayoutItem);
}



bool QtVCardAddressField::isEmpty() const {
	return streetLineEdit->text().isEmpty() &&
			poboxLineEdit->text().isEmpty() &&
			addressextLineEdit->text().isEmpty() &&
			cityLineEdit->text().isEmpty() &&
			pocodeLineEdit->text().isEmpty() &&
			regionLineEdit->text().isEmpty() &&
			countryLineEdit->text().isEmpty();
}

void QtVCardAddressField::setAddress(const VCard::Address& address) {
	setPreferred(address.isPreferred);
	setHome(address.isHome);
	setWork(address.isWork);
	getTagComboBox()->setTag("postal", address.isPostal);
	getTagComboBox()->setTag("parcel", address.isParcel);
	domesticRadioButton->setChecked(address.deliveryType == VCard::DomesticDelivery);
	internationalRadioButton->setChecked(address.deliveryType == VCard::InternationalDelivery);
	streetLineEdit->setText(P2QSTRING(address.street));
	poboxLineEdit->setText(P2QSTRING(address.poBox));
	addressextLineEdit->setText(P2QSTRING(address.addressExtension));
	cityLineEdit->setText(P2QSTRING(address.locality));
	pocodeLineEdit->setText(P2QSTRING(address.postalCode));
	regionLineEdit->setText(P2QSTRING(address.region));
	countryLineEdit->setText(P2QSTRING(address.country));
}

VCard::Address QtVCardAddressField::getAddress() const {
	VCard::Address address;
	address.isPreferred = getPreferred();
	address.isHome = getHome();
	address.isWork = getWork();
	address.deliveryType = domesticRadioButton->isChecked() ? VCard::DomesticDelivery : (internationalRadioButton->isChecked() ? VCard::InternationalDelivery : VCard::None);
	address.isPostal = getTagComboBox()->isTagSet("postal");
	address.isParcel = getTagComboBox()->isTagSet("parcel");
	address.street = Q2PSTRING(streetLineEdit->text());
	address.poBox = Q2PSTRING(poboxLineEdit->text());
	address.addressExtension = Q2PSTRING(addressextLineEdit->text());
	address.locality = Q2PSTRING(cityLineEdit->text());
	address.postalCode = Q2PSTRING(pocodeLineEdit->text());
	address.region = Q2PSTRING(regionLineEdit->text());
	address.country = Q2PSTRING(countryLineEdit->text());
	return address;
}

void QtVCardAddressField::handleEditibleChanged(bool isEditable) {
	if (streetLineEdit) streetLineEdit->setEditable(isEditable);
	if (poboxLineEdit) poboxLineEdit->setEditable(isEditable);
	if (addressextLineEdit) addressextLineEdit->setEditable(isEditable);
	if (cityLineEdit) cityLineEdit->setEditable(isEditable);
	if (pocodeLineEdit) pocodeLineEdit->setEditable(isEditable);
	if (regionLineEdit) regionLineEdit->setEditable(isEditable);
	if (countryLineEdit) countryLineEdit->setEditable(isEditable);

	if (deliveryTypeLabel) {
		deliveryTypeLabel->setText(buttonGroup->checkedButton() == 0 ? "" : buttonGroup->checkedButton()->text());
		deliveryTypeLabel->setVisible(!isEditable);
	}
	if (domesticRadioButton) domesticRadioButton->setVisible(isEditable);
	if (internationalRadioButton) internationalRadioButton->setVisible(isEditable);

	foreach (QWidget* widget, textFields) {
		QtResizableLineEdit* lineEdit;
		if ((lineEdit = dynamic_cast<QtResizableLineEdit*>(widget))) {
			lineEdit->setShown(isEditable ? true : !lineEdit->text().isEmpty());
			lineEdit->setStyleSheet(isEditable ? "" : "QLineEdit { border: none; background: transparent; }");
		}
	}
}

}