#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <errno.h>
#include <stdint.h>
#include <systemd/sd-bus.h>
#include "sensorhandler.h"
#include <mapper.h>


extern void send_esel(uint16_t recordid);

sd_bus *bus = NULL;

// Use a lookup table to find the interface name of a specific sensor
// This will be used until an alternative is found.  this is the first
// step for mapping IPMI
int find_openbmc_path(const uint8_t num, dbus_interface_t *interface) {

    const char  *objname = "/org/openbmc/managers/System";

    char  *str1, *str2, *str3;
    sd_bus_error error = SD_BUS_ERROR_NULL;
    sd_bus_message *reply = NULL, *m=NULL;
    int r;
    char  *busname = NULL;

    r = mapper_get_service(bus, objname, &busname);
    if (r < 0) {
        log<level::ERR>("Failed to get busname",
                        entry("BUS=%s", objname),
                        entry("ERRNO=0x%X", -r));
        goto final;
    }

    r = sd_bus_message_new_method_call(bus,&m,busname,objname,busname,"getObjectFromByteId");
    if (r < 0) {
        log<level::ERR>("Failed to create a method call",
                        entry("ERRNO=0x%X", -r));
    }

    r = sd_bus_message_append(m, "sy", type, num);
    if (r < 0) {
        log<level::ERR>("Failed to create a input parameter",
                        entry("ERRNO=0x%X", -r));
    }

    // Call the IPMI responder on the bus so the message can be sent to the CEC
    r = sd_bus_call(bus, m, 0, &error, &reply);
    if (r < 0) {
        log<level::ERR>("Failed to call the method",
                        entry("ERRNO=0x%X", -r));
        goto final;
    }


    r = sd_bus_message_read(reply, "(sss)", &str1, &str2, &str3);
    if (r < 0) {
        log<level::ERR>("Failed to get a response",
                        entry("ERRNO=0x%X", -r));
        goto final;
    }

    strncpy(interface->bus, str1, MAX_DBUS_PATH);
    strncpy(interface->path, str2, MAX_DBUS_PATH);
    strncpy(interface->interface, str3, MAX_DBUS_PATH);

    interface->sensornumber = num;

final:

    sd_bus_error_free(&error);
    sd_bus_message_unref(m);
    free (busname);

    return r;
}




int main(int argc, char *argv[])
{
    int base;
    char *endptr, *str;
    long val;
    uint16_t num;
    int r;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s sensornumber\n", argv[0]);
        return -1;
    }

    str = argv[1];
    base = (argc > 2) ? atoi(argv[2]) : 10;

    val = strtol(str, &endptr, base);

    num = (uint16_t) val;



    /* Connect to system bus */
    r = sd_bus_open_system(&bus);
    if (r < 0) {
        log<level::ERR>("Failed to connect to system bus",
                        entry("ERRNO=0x%X", -r));
        goto finish;
    }

    send_esel(num);


finish:
    sd_bus_unref(bus);

    return 0;
}
