#include "receiptgenerator.h"
#include <settingsservice.h>
#include <settings/globalsettings.h>

#include <QTextCodec>
#include <QFile>

const QString ReceiptGenerator::DIACRITIC = "ÂâÁáÄäĂăĄąĆćČčÇçĎďĐđÉéËëĚěĘęÍíÎîĹĺĽľŁłŃńŇňÓóÖöÔôŐőŔŕŘřŚśŠšŞşŤťŢţÚúÜüŮůŰűÝýŹźŽžŻż";
const QString ReceiptGenerator::NON_DIACRITIC = "AaAaAaAaAaCcCcCcDdDdEeEeEeEeIiIiLlLlLlNnNnOoOoOoOoRrRrSsSsSsTtTtUuUuUuUuYyZzZzZz";

ReceiptGenerator::ReceiptGenerator()
{

}

void ReceiptGenerator::setVoucher(const QSharedPointer<Voucher> &voucher)
{
    m_voucher = voucher;
}

void ReceiptGenerator::setSettings(const ShopSettingsPtr &settings)
{
    m_settings = settings;
}

void ReceiptGenerator::save()
{
    SettingsService srvShopSettings("SHOP");
    ShopSettingsPtr shopSettings = srvShopSettings.loadSettings<ShopSettings>();

    QString outFile = m_outputFile;

    if (outFile.isEmpty())
    {
        outFile = shopSettings->output();
    }

    QFile file(outFile);
    file.open(QIODevice::WriteOnly);
    file.write(generate());
    file.close();
}

void ReceiptGenerator::print()
{
    save();
}

QString ReceiptGenerator::outputFile() const
{
    return m_outputFile;
}

void ReceiptGenerator::setOutputFile(const QString &outputFile)
{
    m_outputFile = outputFile;
}

QByteArray ReceiptGenerator::generate()
{
    QByteArray out;

    char printMode = 8 | 16 ;

    SettingsService srvGsSettings("CORE");
    SettingsService srvShopSettings("SHOP");

    ShopSettingsPtr shopSettings = srvShopSettings.loadSettings<ShopSettings>();
    GlobalSettingsPtr gs = srvGsSettings.loadSettings<GlobalSettings>();

    out.append("\x1b\x40\x1b\x61\x01");
    out.append(prepareString(gs->firmName()));
    out.append("\x0a");
    out.append(prepareString(gs->street() + " " + gs->houseNumber()));
    out.append("\x0a");
    out.append(prepareString(gs->zipCode() + " " + gs->city()));
    out.append("\x0a");
    out.append(prepareString("IC: " + QString::number(gs->ic())));
    out.append("\x0a");

    out.append("\x1b\x21");
    out.append(printMode);
    for (int i = 0; i < shopSettings->lettersPerLine(); i++ )
    {
        out.append("-");
    }
    out.append("\x1b\x21");
    out.append((char)0);
    out.append("\x0a");

    foreach (QSharedPointer<VoucherItem> item, m_voucher->items()) {
        QString name = item->name();
        QString price = QString::number(item->price().toDouble(), 'f', 2);

        int numSpaces = 0;
        if ((name.length() + price.length()) < shopSettings->lettersPerLine())
        {
            numSpaces = shopSettings->lettersPerLine() - (name.length() + price.length());
            out.append(prepareString(name));
        }
        else
        {
            numSpaces = shopSettings->lettersPerLine() - (name.length() + price.length());
            out.append(prepareString(name));
            out.append("\x0a");
        }

        for (int i = 0; i < numSpaces; i++)
        {
            out.append(" ");
        }
        out.append(prepareString(price));
        out.append("\x0a");
    }

    out.append("\x1b\x21");
    out.append(printMode);
    for (int i = 0; i < shopSettings->lettersPerLine(); i++ )
    {
        out.append("-");
    }
    out.append("\x1b\x21");
    out.append((char)0);
    out.append("\x0a");

    out.append("\x1b\x21");
    out.append(printMode);
    out.append("Celekem:");

    QString totalPrice = QString::number(m_voucher->totalPrice().toDouble(), 'f', 2);
    int numSpaces = shopSettings->lettersPerLine() - (8 + totalPrice.length());
    for (int i = 0; i < numSpaces; i++)
    {
        out.append(" ");
    }

    out.append(prepareString(totalPrice));
    out.append("\x1b\x21");
    out.append((char)0);
    out.append("\x0a");
    out.append("BKP:");
    out.append("\x0a");
    out.append(prepareString(m_voucher->eetBkp()));
    out.append("\x0a");
    out.append("FIK:");
    out.append("\x0a");
    out.append(prepareString(m_voucher->eetFik()));
    out.append("\x0a");
    out.append("\x0a");
    out.append("\x0a");

    return out;
}

QByteArray ReceiptGenerator::prepareString(const QString &str)
{
    QString strOut = str;

     //ToDo - dát do nastavení

    for (int i = 0; i < DIACRITIC.length(); i++)
    {
        strOut = strOut.replace(DIACRITIC.at(i), NON_DIACRITIC.at(i));
    }

    QTextCodec *codec = QTextCodec::codecForName("IBM850");
    return codec->fromUnicode(strOut);
}
