/*
 * 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.
 */

#pragma once

#include "applib/ui/dialogs/dialog.h"
#include "applib/ui/window_stack.h"

//! Initializes the dialog.
//! @param dialog Pointer to a \ref Dialog to initialize
//! @param dialog_name The debug name to give the dialog
void dialog_init(Dialog *dialog, const char *dialog_name);

//! Pushes the dialog onto the window stack.
//! @param dialog Pointer to a \ref Dialog to push
//! @param window_stack Pointer to a \ref WindowStack to push the \ref Dialog to
void dialog_push(Dialog *dialog, WindowStack *window_stack);

//! Wrapper to call \ref dialog_push() for an application
//! @note: Put a better comment here when we export
void app_dialog_push(Dialog *dialog);

//! Pops the dialog off the window stack.
//! @param dialog Pointer to a \ref Dialog to push
void dialog_pop(Dialog *dialog);

//! This function is called by each type of dialog's load functions to execute common dialog code.
//! @param dialog Pointer to a \ref Dialog to load
void dialog_load(Dialog *dialog);

//! Displays the icon by playing the kino layer
//! @param dialog Pointer to the \ref Dialog to appear
void dialog_appear(Dialog *dialog);

//! This function is called by each type of dialog's unload function. The dialog_context is the
//! the dialog object being unloaded.
//! @param dialog Pointer to a \ref Dialog to unload
void dialog_unload(Dialog *dialog);

//! Draw the status layer on the dialog.
//! @param dialog Pointer to a \ref Dialog to draw the status layer on
//! @param status_layer_frame The frame of the status layer
void dialog_add_status_bar_layer(Dialog *dialog, const GRect *status_layer_frame);

//! Create the icon for the dialog.
//! @param dialog Pointer to a \ref Dialog from which to grab the icon id
//! @return the \ref KinoReel for the dialog's icon
KinoReel *dialog_create_icon(Dialog *dialog);

//! Initialize the dialog's icon layer with the provided image and frame origin.
//! @param dialog Pointer to \ref Dialog from which to initialize it's \ref KinoLayer
//! @param image Pointer to a \ref KinoReel to put on the dialog's \ref KinoLayer
//! @param icon_origin The starting point for the icon, if it is being animated,
//!    this is the point it will animate to.
//! @param animated `True` if animated, otherwise `False`
//! @return `True` if successfully initialized the dialog's \ref KinoLayer, otherwise
//!     `False`
bool dialog_init_icon_layer(Dialog *dialog, KinoReel *image,
                            GPoint icon_origin, bool animated);
