#include "headers/Park_spot.h"

// constructors

Park_spot::Park_spot(Vehicle_type v_type_)
    : parked_customer{0}, id{auto_increment_db() + 1}, taken{false}, v_type{v_type_} {
    save_db();
}

Park_spot::Park_spot(int id_, bool taken_, int parked, Vehicle_type v_type_)
    : parked_customer{parked},
      id{id_},
      v_type{v_type_},
      taken{taken_} // TODO: think about how init parked?
{}

// clock in en out, calls de juist(in/out) van de customer aan de hand van
// internal state van taken
void Park_spot::clock(Customer& c_customer) {
    if (!taken) {
        parked_customer = c_customer.id;
        taken = true;
        c_customer.clock_in(id);
        update_db();
    } else {
        taken = false;
        c_customer.clock_out(id);
        parked_customer = 0;
        update_db();
    }
}

// --------------------- db functs

void Park_spot::update_db() {
    string statement = "UPDATE Park_spot SET taken = '', customer_id  = '' where id = '';";
    statement.insert(63, to_string(id));
    if (taken) {
        statement.insert(49, to_string(parked_customer));
        statement.insert(30, "1");
    } else {
        statement.insert(49, "NULL");
        statement.insert(30, "0");
    }
    data::db.exec(statement);
}

void Park_spot::save_db() {
    //(int id, bool taken, int customer_id)
    string statement{"insert into Park_spot values ( , , , );"};
    // after ( = 28)
    statement.insert(36, to_string(int(v_type)));
    statement.insert(34, "NULL");
    statement.insert(32, "0");
    statement.insert(30, to_string(id));
    SQLite::Transaction transaction(data::db);
    data::db.exec(statement);
    transaction.commit();
}

void Park_spot::delete_db() {
    string statement = "delete from Park_spot where id= ;";
    statement.insert(statement.length() - 2, to_string(id));
    SQLite::Transaction transaction(data::db);
    data::db.exec(statement);
    transaction.commit();
}

int Park_spot::auto_increment_db() {
    SQLite::Statement max_id(data::db, "select max(id) from Park_spot;");
    int id = 0;
    max_id.executeStep();
    id = max_id.getColumn(0);
    max_id.reset();
    return id;
}
