#include <QDebug>
#include <QDateTime>

#include "calculate_parking_tickets.h"
#include "calculate_parking_tickets_algorithms.h"
#include "calculate_parking_tickets_tariff.h"
#include "calculate_parking_tickets_utils.h"
#include "message_handler.h"

int main() {

    if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
      atbInstallMessageHandler(atbDebugOutput);
      setDebugLevel(QtMsgType::QtDebugMsg);
    }

    /*
        Germersheim:
        Freiparkzeit: 90 min
        Stundentarif: 7:00 - 20:00 3,50 Euro/h
        Tagesmaximum: 18 Euro, gueltig 24h ab einfahrt
        Nacht-Tarif: 20:00 - 7:00: 8 Euro

        Fragen:
        1. Fuer die Abrechnung bleiben mehrere Moeglichkeiten.
            a:  minutengenau: eine Minute kostet 0.0583 Euro (bzw. 0.012 Euro nachts).
            b:  im Stunden-Raster ausgerichtet an der tatsaechlichen Uhrzeit
                wie angeben: jede angefangene Stunde kostet 3.50 Euro bzw.
                8 Euro Nacht-Tarif.

        Beispiele:
        zu b:   Einfahrt um 18:24 Uhr. Bis 19:54 Uhr ist dann frei. Die 6 Minuten
                bis 20:00 Uhr kosten dann 3.50 Euro. Ausfahrt um 21.00 Uhr: kostet
                dann 8 Euro, insgesamt also 11.50 Euro.
        zu a:   wie vor, nur minutengenaue Abrechnung: 6 Minuten kosten dann
                6*0.0583 = 0.35 Euro, plus 1h nachts: 60*0.012 = 0.72 Euro,
                insgesamt also 1.07 Euro.

        Was (logisch) nicht moeglich ist: ein Stunden-Raster, das nicht an der
        tatsaechlichen Uhrzeit ausgerichtet ist.
        Beispiel: Einfahrt 18:00 Uhr, frei bis 19:30 Uhr. Wie soll nun die
        naechste Stunde berechnet werden? Nach Tag- oder Nacht-Tariff?

        2:  Tagesmaximum
        a:  Es gibt also eine maximale Parkzeit von 24h, und der maximale Preis
            ist 18 Euro? Oder gibt es kein Maximum fuer die Parkdauer, aber der
            Preis ab 24h Parkdauer betraegt einheitlich 18 Euro.

            Im zweiten Fall waere dann Folgendes moeglich:
            Einfahrt 5:30 Uhr, frei bis 7:00 Uhr.
            Kosten von 7:00 - 20:00 Uhr: 13*3.50 = 45.50 Euro.
            Kosten von 20:00 - 7:00 Uhr: 8 Euro.
            Ausfahrt: 8:00 Uhr: 3.50 Euro, insgesamt eigentlich 57 Euro,
            nach obiger Regel aber dann nur 18 Euro.
    */

    /*
        TODO:
        1: Abrechnungsmodus:
            a: minutengenau
            b: 15-min-Raster, ausgerichtet an der tatseachlichen Uhrzeit
            b: 30-min-Raster, ausgerichtet an der tatseachlichen Uhrzeit
            b: 60-min-Raster, ausgerichtet an der tatseachlichen Uhrzeit
            c: wie im Tarif angegeben mit einer moeglichst groben Aufloesung.
    */

    parking_tariff_t *tariff = new parking_tariff_t();

    tariff->unit_scale_factor = 1.0;
    tariff->unit_definition = 1000;
    tariff->waiting_period = 0;
    // tariff->waiting_period = 90;

    int  const si = sizeof(TariffStep);
    qDebug() << si;
    QDate today = QDate::currentDate();
    int todayWeekDay = today.dayOfWeek();
    if (todayWeekDay > Qt::Monday) {
        int day = today.day() - todayWeekDay;
        if (!today.setDate(today.year(), today.month(), day)) {
            qFatal("Setting today failed");
        }
    }
    QDate sunday = today;
    qDebug() << sunday;
    for (int i = Qt::Monday; i <= Qt::Sunday; ++i) {
        // days start at midnight
        QDateTime startMinute(sunday.addDays(i), QTime( 0, 0));

        //qDebug() << "startMinute=" << startMinute << startMinute.date().dayOfWeek();

        // first block: 0:00 - 7:00. night-tariff.
        TariffStep *current = &tariff->m_tariffSteps[i][0];
        TariffStep *next = &tariff->m_tariffSteps[i][7*60];
        *current = TariffStep(startMinute, 0, next);

        //qDebug() << "current    =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
        //qDebug() << "offset     =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[i][0])/sizeof(TariffStep);

        // from 7:00 on, each hour costs 3.50 euros == 350000 units
        startMinute = startMinute.addSecs(7*3600);
        current = next;

        for (int j = 7; j < 20; ++j) {
            next = current + 60;
            *current = TariffStep(startMinute, 350000, next);

        //qDebug() << "current    =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
        //qDebug() << "offset     =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[i][0])/sizeof(TariffStep);

            startMinute = startMinute.addSecs(3600);
            current = next;
        }

        if (i != Qt::Sunday) {
            next = current + 4*60 + 7*60;
        } else {
            next = &tariff->m_tariffSteps[Qt::Monday][7*60];
        }
        *current = TariffStep(startMinute, 0, next);

        if (i != Qt::Sunday) {
            qDebug() << "current    =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
            qDebug() << "offset     =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[i][0])/sizeof(TariffStep);
        } else {
            qDebug() << "current    =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
            if (&tariff->m_tariffSteps[1][420] == current->next()) {
                qDebug() << "OK";
                qDebug() << "offset     =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[1][0])/sizeof(TariffStep);
            }
        }
    }


    return 0;

#if 0
    price_t price;
    memset(&price, 0x00, sizeof(price));
    QDateTime start = QDateTime::currentDateTime();

    minute_t const s = TUtils::toMinutes(start);
    minute_t const e = s + 60;

    qDebug() << "start =" << start << "("  << s << ")";
    //start.setTime(QTime()); ruecksetzen des tages auf 0:00
    //QTime t = start.time();
    for (int i=1; i < (e-s); ++i) {
        qDebug() << i << start << start.date().dayOfWeek();
        start = start.addSecs(60);
    }
#endif
    //if (TAlgo::compute_price_for_parking_ticket(tariff, s, e, &price)) {

    //}

    // Calculate_parking_tickets cpt;

    return 0;
}
