/*
 * 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 "click.h"
#include "layer.h"
#include "property_animation.h"
#include "applib/fonts/fonts.h"

#define SELECTION_LAYER_DEFAULT_CELL_HEIGHT PBL_IF_RECT_ELSE(34, 40)

#define MAX_SELECTION_LAYER_CELLS 3

typedef char* (*SelectionLayerGetCellText)(unsigned index, void *callback_context);

typedef void (*SelectionLayerCompleteCallback)(void *callback_context);

typedef void (*SelectionLayerIncrementCallback)(unsigned selected_cell_idx, void *callback_context);

typedef void (*SelectionLayerDecrementCallback)(unsigned selected_cell_idx, void *callback_context);

typedef struct SelectionLayerCallbacks {
  SelectionLayerGetCellText get_cell_text;
  SelectionLayerCompleteCallback complete;
  SelectionLayerIncrementCallback increment;
  SelectionLayerDecrementCallback decrement;
} SelectionLayerCallbacks;


typedef struct SelectionLayer {
  Layer layer;
  unsigned num_cells;
  unsigned cell_widths[MAX_SELECTION_LAYER_CELLS];
  unsigned cell_padding;
  unsigned selected_cell_idx;

  // If is_active = false the the selected cell will become invalid, and any clicks will be ignored
  bool is_active;

  GFont font;
  GColor inactive_background_color;
  GColor active_background_color;

  SelectionLayerCallbacks callbacks;
  void *callback_context;

  // Animation stuff
  Animation *value_change_animation;
  bool bump_is_upwards;
  unsigned bump_text_anim_progress;
  AnimationImplementation bump_text_impl;
  unsigned bump_settle_anim_progress;
  AnimationImplementation bump_settle_anim_impl;

  Animation *next_cell_animation;
  unsigned slide_amin_progress;
  AnimationImplementation slide_amin_impl;
  unsigned slide_settle_anim_progress;
  AnimationImplementation slide_settle_anim_impl;
} SelectionLayer;



void selection_layer_init(SelectionLayer *selection_layer, const GRect *frame, unsigned num_cells);

SelectionLayer* selection_layer_create(GRect frame, unsigned num_cells);

void selection_layer_deinit(SelectionLayer* selection_layer);

void selection_layer_destroy(SelectionLayer* selection_layer);

void selection_layer_set_cell_width(SelectionLayer *selection_layer,
                                    unsigned cell_idx, unsigned width);

void selection_layer_set_font(SelectionLayer *selection_layer, GFont font);

void selection_layer_set_inactive_bg_color(SelectionLayer *selection_layer, GColor color);

void selection_layer_set_active_bg_color(SelectionLayer *selection_layer, GColor color);

void selection_layer_set_cell_padding(SelectionLayer *selection_layer, unsigned padding);

// When transitioning from inactive -> active, the selected cell will be index 0
void selection_layer_set_active(SelectionLayer *selection_layer, bool is_active);

void selection_layer_set_click_config_onto_window(SelectionLayer *selection_layer,
                                                  struct Window *window);

void selection_layer_set_callbacks(SelectionLayer *selection_layer,
                                   void *callback_context,
                                   SelectionLayerCallbacks callbacks);

int selection_layer_default_cell_height(void);
