/*
*    main.c
*
*    MBTK important service support.
*
*/
/******************************************************************************

                          EDIT HISTORY FOR FILE

  WHEN        WHO       WHAT,WHERE,WHY
--------    --------    -------------------------------------------------------
2024/6/12     LiuBin      Initial version

******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>

#include "mbtk_type.h"
#include "mbtk_log.h"
#include "instance_info.h"
#include "mbtk_str.h"
#include "mbtk_utils.h"

#define MBTK_SERVICES_PID_FILE "/var/run/mbtk_servicesd.pid"
#define MBTK_SERVICES_CONF_FILE "/etc/mbtk_servicesd.conf"

extern int instance_info_size;
extern instance_info_t instance_infos[];
int ins_monitor_service_start();

static void config_parse(const char *conf_file)
{
    FILE *fptr = fopen(conf_file, "r");
    if(fptr != NULL) {
        char line[1024] = {0};
        bool respawn_process = FALSE;
        while(fgets(line, sizeof(line), fptr) != NULL && strlen(line) > 0) {
            if(str_startwith(line, "#")) {
                memset(line, 0, sizeof(line));
                continue;
            }

            if(!respawn_process && str_startwith(line, "respawn_start")) {
                respawn_process = TRUE;
                memset(line, 0, sizeof(line));
                continue;
            } else if(respawn_process && str_startwith(line, "respawn_end")) {
                respawn_process = FALSE;
                memset(line, 0, sizeof(line));
                continue;
            }

            char *ptr = line + strlen(line) - 1;
            while(ptr >= line && (*ptr == '\r' || *ptr == '\n' || *ptr == ' ')) {
                *ptr-- = '\0';
            }

            if(ptr < line) { // Empty line
                memset(line, 0, sizeof(line));
                continue;
            }

            if(respawn_process && instance_info_size < INSTANCE_NUM_MAX) {
                ptr = strstr(line, ":");
                if(ptr) {
                    *ptr++ = '\0';
                    memcpy(instance_infos[instance_info_size].ins_name, line, strlen(line));
                    memcpy(instance_infos[instance_info_size].ins_cmd, ptr, strlen(ptr));
                    instance_infos[instance_info_size].ins_pid = -1;
                    instance_info_size++;
                }
            }

            memset(line, 0, sizeof(line));
        }
        fclose(fptr);
    }
}

int main(int argc, char *argv[])
{
    mbtk_log_init("radio", "MBTK_SERVICES");

    MBTK_SOURCE_INFO_PRINT("mbtk_services");

#ifdef MBTK_DUMP_SUPPORT
    mbtk_debug_open(NULL, TRUE);
#endif

    if(app_already_running(MBTK_SERVICES_PID_FILE)) {
        LOGW("daemon already running.");
        exit(1);
    }

    config_parse(MBTK_SERVICES_CONF_FILE);

    // Start services.
    if(ins_monitor_service_start()) {
        LOGW("ins_monitor_service_start() fail.");
    }

    while(1) {
        sleep(24 * 60 * 60);
    }

    return 0;
}

