/*
 * Copyright 2024 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "app_idle_timeout.h"

#include "kernel/event_loop.h"
#include "os/tick.h"
#include "services/common/new_timer/new_timer.h"
#include "shell/normal/watchface.h"
#include "shell/shell.h"
#include "system/logging.h"
#include "system/passert.h"


static const int WATCHFACE_TIMEOUT_MS = 30000;

TimerID s_timer;
bool s_app_paused = false;
bool s_app_started = false;

#ifndef NO_WATCH_TIMEOUT
static void prv_kernel_callback_watchface_launch(void* data) {
  watchface_launch_default(shell_get_watchface_compositor_animation(true /* watchface_is_dest */));
}

static void prv_timeout_expired(void *cb_data) {
  PBL_LOG(LOG_LEVEL_DEBUG, "App idle timeout hit! launching watchface");
  launcher_task_add_callback(prv_kernel_callback_watchface_launch, NULL);
}

static void prv_start_timer(bool create) {
  if (create) {
    s_timer = new_timer_create();
  }

  if (s_timer != TIMER_INVALID_ID && !s_app_paused && s_app_started) {
    bool success = new_timer_start(s_timer, WATCHFACE_TIMEOUT_MS, prv_timeout_expired,
        NULL, 0 /* flags */);
    PBL_ASSERTN(success);
  }
}
#endif

void app_idle_timeout_start(void) {
  PBL_ASSERTN(s_timer == TIMER_INVALID_ID);

  s_app_started = true;
#ifndef NO_WATCH_TIMEOUT
  prv_start_timer(true /* create a timer */);
#endif
}

void app_idle_timeout_stop(void) {
  if (s_timer != TIMER_INVALID_ID) {
    new_timer_delete(s_timer);
    s_timer = TIMER_INVALID_ID;
    s_app_started = false;
  }
}

void app_idle_timeout_pause(void) {
  if (s_timer != TIMER_INVALID_ID) {
    new_timer_stop(s_timer);
  }
  s_app_paused = true;
}

void app_idle_timeout_resume(void) {
  s_app_paused = false;
#ifndef NO_WATCH_TIMEOUT
  prv_start_timer(false /* do not create a timer */);
#endif
}

void app_idle_timeout_refresh(void) {
#ifndef NO_WATCH_TIMEOUT
  prv_start_timer(false /* do not create a timer */);
#endif
}
