#ifndef __MXQ_JOB_H__
#define __MXQ_JOB_H__ 1

#include <stdint.h>
#include <mysql.h>

#include <sys/time.h>
#include <sys/resource.h>

#include <sched.h>

#include "mxq_daemon.h"
#include "mxq_group.h"

struct mxq_job {
    uint64_t  job_id;
    uint16_t  job_status;
    uint64_t  job_flags;
    uint16_t  job_priority;

    uint64_t  group_id;
    struct mxq_group * group_ptr;

    char *     job_workdir;

    uint32_t   job_argc;

    char **    job_argv;
    char *     job_argv_str;

    char *     job_stdout;
    char *     job_stderr;

    char *     tmp_stdout;
    char *     tmp_stderr;

    uint32_t   job_umask;

    char *     host_submit;

    char *     host_id;
    uint32_t   daemon_id;
    char *     daemon_name;

    char *     host_hostname;

    uint32_t   host_pid;
    uint32_t   host_slots;
    cpu_set_t   host_cpu_set;
    char *      host_cpu_set_str;

    int64_t    date_submit;
    int64_t    date_start;
    int64_t    date_end;

    struct timeval stats_starttime;

    uint64_t   stats_max_sumrss;

    int32_t        stats_status;
    struct timeval stats_realtime;
    struct rusage  stats_rusage;
};

#define MXQ_JOB_STATUS_INQ            0
#define MXQ_JOB_STATUS_ASSIGNED     100
#define MXQ_JOB_STATUS_LOADED       150
#define MXQ_JOB_STATUS_RUNNING      200

#define MXQ_JOB_STATUS_KILLED       400
#define MXQ_JOB_STATUS_FAILED       750

#define MXQ_JOB_STATUS_CANCELLING   989

#define MXQ_JOB_STATUS_CANCELLED    990
#define MXQ_JOB_STATUS_UNKNOWN      999
#define MXQ_JOB_STATUS_FINISHED    1000

#define _to_string(s) #s
#define status_str(x) _to_string(x)

char *mxq_job_status_to_name(uint64_t status);

void mxq_job_free_content(struct mxq_job *j);

int mxq_load_job(struct mx_mysql *mysql, struct mxq_job **mxq_jobs, uint64_t job_id);
int mxq_load_jobs_in_group(struct mx_mysql *mysql, struct mxq_job **mxq_jobs, struct mxq_group *grp);
int mxq_load_jobs_in_group_with_status(struct mx_mysql *mysql, struct mxq_job **mxq_jobs, struct mxq_group *grp, uint64_t job_status);
int mxq_unassign_jobs_of_server(struct mx_mysql *mysql, struct mxq_daemon *daemon);
int mxq_set_job_status_running(struct mx_mysql *mysql, struct mxq_job *job);
int mxq_set_job_status_exited(struct mx_mysql *mysql, struct mxq_job *job);
int mxq_set_job_status_unknown(struct mx_mysql *mysql, struct mxq_job *job);
int mxq_job_set_tmpfilenames(struct mxq_group *g, struct mxq_job *j);
int mxq_load_job_from_group_for_daemon(struct mx_mysql *mysql, struct mxq_job *mxqjob, uint64_t group_id, struct mxq_daemon *daemon,unsigned long slots_per_job);
int mxq_load_jobs_running_on_server(struct mx_mysql *mysql, struct mxq_job **jobs_result, struct mxq_daemon *daemon);
int mxq_unload_job_from_server(struct mx_mysql *mysql, uint64_t job_id);
#endif