#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <getopt.h>
#include <string.h>
#include "vm_power_cli_guest.h"
#include "parse.h"
static void
sig_handler(int signo)
{
    printf("Received signal %d, exiting...\n", signo);
    unsigned lcore_id;
    }
}
#define MAX_HOURS 24
static int
parse_args(int argc, char **argv)
{
    int opt, ret;
    char **argvopt;
    int option_index;
    char *prgname = argv[0];
    const struct option lgopts[] = {
        { "vm-name", required_argument, 0, 'n'},
        { "busy-hours", required_argument, 0, 'b'},
        { "quiet-hours", required_argument, 0, 'q'},
        { "port-list", required_argument, 0, 'p'},
        { "vcpu-list", required_argument, 0, 'l'},
        { "policy", required_argument, 0, 'o'},
        {NULL, 0, 0, 0}
    };
    struct channel_packet *policy;
    unsigned short int hours[MAX_HOURS];
    unsigned short int cores[MAX_VCPU_PER_VM];
    unsigned short int ports[MAX_VCPU_PER_VM];
    int i, cnt, idx;
    policy = get_policy();
    set_policy_defaults(policy);
    argvopt = argv;
    while ((opt = getopt_long(argc, argvopt, "n:b:q:p:",
                  lgopts, &option_index)) != EOF) {
        switch (opt) {
        
        case 'n':
            strcpy(policy->vm_name, optarg);
            printf("Setting VM Name to [%s]\n", policy->vm_name);
            break;
        case 'b':
        case 'q':
            
            cnt = parse_set(optarg, hours, MAX_HOURS);
            if (cnt < 0) {
                printf("Invalid value passed to quiet/busy hours - [%s]\n",
                        optarg);
                break;
            }
            idx = 0;
            for (i = 0; i < MAX_HOURS; i++) {
                if (hours[i]) {
                    if (opt == 'b') {
                        printf("***Busy Hour %d\n", i);
                        policy->timer_policy.busy_hours
                            [idx++] = i;
                    } else {
                        printf("***Quiet Hour %d\n", i);
                        policy->timer_policy.quiet_hours
                            [idx++] = i;
                    }
                }
            }
            break;
        case 'l':
            cnt = parse_set(optarg, cores, MAX_VCPU_PER_VM);
            if (cnt < 0) {
                printf("Invalid value passed to vcpu-list - [%s]\n",
                        optarg);
                break;
            }
            idx = 0;
            for (i = 0; i < MAX_VCPU_PER_VM; i++) {
                if (cores[i]) {
                    printf("***Using core %d\n", i);
                    policy->vcpu_to_control[idx++] = i;
                }
            }
            policy->num_vcpu = idx;
            printf("Total cores: %d\n", idx);
            break;
        case 'p':
            cnt = parse_set(optarg, ports, MAX_VCPU_PER_VM);
            if (cnt < 0) {
                printf("Invalid value passed to port-list - [%s]\n",
                        optarg);
                break;
            }
            idx = 0;
            for (i = 0; i < MAX_VCPU_PER_VM; i++) {
                if (ports[i]) {
                    printf("***Using port %d\n", i);
                    set_policy_mac(i, idx++);
                }
            }
            policy->nb_mac_to_monitor = idx;
            printf("Total Ports: %d\n", idx);
            break;
        case 'o':
            if (!strcmp(optarg, "TRAFFIC"))
                policy->policy_to_use = TRAFFIC;
            else if (!strcmp(optarg, "TIME"))
                policy->policy_to_use = TIME;
            else if (!strcmp(optarg, "WORKLOAD"))
                policy->policy_to_use = WORKLOAD;
            else if (!strcmp(optarg, "BRANCH_RATIO"))
                policy->policy_to_use = BRANCH_RATIO;
            else {
                printf("Invalid policy specified: %s\n",
                        optarg);
                return -1;
            }
            break;
        
        case 0:
            break;
        default:
            return -1;
        }
    }
    if (optind >= 0)
        argv[optind-1] = prgname;
    ret = optind-1;
    optind = 0; 
    return ret;
}
int
main(int argc, char **argv)
{
    int ret;
    unsigned lcore_id;
    if (ret < 0)
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);
    argc -= ret;
    argv += ret;
    
    ret = parse_args(argc, argv);
    if (ret < 0)
        rte_exit(EXIT_FAILURE, 
"Invalid arguments\n");
     }
    run_cli(NULL);
    return 0;
}