#include <stdio.h>
#include <string.h>
#include "sleep.h"
#include "ulp.h"
#include "ulp-activity.h"
#include "outrigger-activity.h"
#include "bt-client-activity.h"
#include "timer-activity.h"
#include "sleep-activity.h"
#include "driver/uart.h"
#include "external-wakeup-button.h"
#include "flash-memory-activity.h"
#include "acquisition-activity.h"

//static esp_sleep_wakeup_cause_t cause;
double verify_time_to_sleep;
double verify_time_to_sleep_post_send;
static uint16_t counter_to_sleep = 0;
static bool flag_first_time_into_send_function = false;
static bool first_timeout_update = true;


void sleep_config(){
    
    /* Timeout to go to sleep */
    timeout_init(&verify_time_to_sleep);
    ulp_config();
}

void sleep_activity(){
    esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
    /* If data was sent to go to sleep for 45s */
    if(get_send_status()){
        set_time_to_sleep(TIME_DEFAULT_SLEEPING);
        printf("\n\nzzz...\n\n");
        printf("\n\nData sent\n\n");
        printf("\n\nSleeping for %ds\n\n",TIME_DEFAULT_SLEEPING);
        clean_counter_to_sleep();
        if(cause!= ESP_SLEEP_WAKEUP_ULP){
            printf("Not a ULP wake up\n");
            bt_turn_off();
            ulp_config();
            ulp_activity();
            start_ulp_program();
            ulp_sleep();
        }else{
            printf("ULP wake up \n");
            ulp_activity();
            start_ulp_program();
            ulp_sleep();
        }
    }
    else if(get_connect_status()){
        if(first_timeout_update){
            /* If connected waits 2s more to send packet */
            timeout_update(&verify_time_to_sleep);
            first_timeout_update = false;
        }
        /* If connected but no sent packet inside 2s go to sleep for 2s*/
        if(timeout_check(verify_time_to_sleep,TIME_DEFAULT_BEFORE_SLEEP)){
            printf("\n\nzzz...\n\n");
            printf("\n\nConnected but data not send\n\n");
            printf("\n\nSleeping for 2s\n\n");

            /* If connected primary is alive so clean counter to try before sleep for 300s */
            clean_counter_to_sleep(); 
            timer_sleep(TIME_TO_SLEEP_IF_CONNECTED_BUT_NOT_SENT);
        }
    }
    else{
        if(timeout_check(verify_time_to_sleep,TIME_DEFAULT_BEFORE_SLEEP)){
            /* If not connected and passed 2s increase attempt */
            increase_counter_to_sleep();

            /* Try to connect 3 times if failed go to sleep for 300s */
            if(counter_to_sleep < ATTEMPT_TO_SLEEP_300_S){
                printf("\n\nzzz...\n\n");
                printf("\n\nNot connected\n\n");
                printf("\n\nSleeping for 2s\n\n");
                timer_sleep(TIME_TO_SLEEP_IF_CONNECTED_BUT_NOT_SENT);
            }
            else{
                printf("\n\nzzz...\n\n");
                printf("\n\nNot connected for 3 times\n\n");
                printf("\n\nSleeping for 300s\n\n");

                /* If not connected but number of attempt is less than 3 go to sleep for 2s.*/
                timer_sleep(TIME_TO_SLEEP_AFTER_3_ATTEMPTS);
            }
        }
    }
}

/* Get function */
uint16_t get_counter_to_sleep(){
    return counter_to_sleep;
}
/* End of get functions */

/* Set functions */
void set_counter_to_sleep(uint16_t counter_to_sleep_to_set){
    counter_to_sleep = counter_to_sleep_to_set;
}
/* End of set functions */
