// ========================================================= //
//                                                           //
//   File      : SAIs.cxx                                    //
//   Purpose   : ItemSelector for SAIs                       //
//                                                           //
//   Coded by Ralf Westram (coder@reallysoft.de) in Oct 21   //
//   http://www.arb-home.de/                                 //
//                                                           //
// ========================================================= //

#include "item_sel_list.h"

#include <arbdbt.h>
#include <aw_root.hxx>
#include <aw_awars.hxx>


static GBDATA *get_first_SAI_data(GBDATA *gb_main, AW_root *, QUERY_RANGE) {
    return GBT_get_SAI_data(gb_main);
}
static GBDATA *get_next_SAI_data(GBDATA *, QUERY_RANGE) {
    return NULp; // there is only ONE 'extended_data'
}

static void select_SAI(GBDATA*,  AW_root *aw_root, const char *item_name) {
    aw_root->awar(AWAR_SAI_NAME)->write_string(item_name);
}
static GBDATA* get_selected_SAI(GBDATA *gb_main, AW_root *aw_root) {
    const char *SAI_name = aw_root->awar(AWAR_SAI_NAME)->read_char_pntr();
    return SAI_name[0] ? GBT_find_SAI(gb_main, SAI_name) : NULp;
}
static void add_selected_SAI_changed_cb(AW_root *aw_root, const RootCallback& cb) {
    aw_root->awar(AWAR_SAI_NAME)->add_callback(cb);
}

static char* get_SAI_id(GBDATA *, GBDATA *gb_sai) {
    GBDATA *gb_name = GB_entry(gb_sai, "name");
    if (!gb_name) return NULp; // sai w/o name -> skip
    return GB_read_as_string(gb_name);
}

static GBDATA *find_SAI_by_id(GBDATA *gb_main, const char *id) {
    return GBT_find_SAI(gb_main, id); // id is 'name' field
}

static GBDATA *get_first_SAI(GBDATA *gb_SAI_data, QUERY_RANGE range) {
    GBDATA *gb_first = NULp;
    switch (range) {
        case QUERY_ALL_ITEMS:    gb_first = GBT_first_SAI_rel_SAI_data(gb_SAI_data); break;
        case QUERY_MARKED_ITEMS: gb_first = GB_first_marked(gb_SAI_data, "extended"); break;
        case QUERY_CURRENT_ITEM: gb_first = get_selected_SAI(GB_get_root(gb_SAI_data), AW_root::SINGLETON); break;
    }
    return gb_first;
}
static GBDATA *get_next_SAI(GBDATA *gb_prev, QUERY_RANGE range) {
    GBDATA *gb_next = NULp;
    switch (range) {
        case QUERY_ALL_ITEMS:    gb_next = GBT_next_SAI(gb_prev); break;
        case QUERY_MARKED_ITEMS: {
            gb_assert(GB_has_key(gb_prev, "extended"));
            gb_next = GB_next_marked(gb_prev, "extended");
            break;
        }
        case QUERY_CURRENT_ITEM: gb_next = NULp; break;
    }
    return gb_next;
}
static void refresh_displayed_SAI() {
}

static struct MutableItemSelector ITEM_sai = {
    QUERY_ITEM_SAI,
    select_SAI,
    get_SAI_id,
    find_SAI_by_id,
    NULp, // no fields selectable
    -1, // length of 'name' is unknown
    NULp, // no changekeys defined for SAI
    "SAI",
    "SAIs",
    "name",
    get_first_SAI_data,
    get_next_SAI_data,
    get_first_SAI,
    get_next_SAI,
    get_selected_SAI,
    add_selected_SAI_changed_cb,
    NULp, NULp,
    refresh_displayed_SAI,
};

ItemSelector& SAI_get_selector() { return ITEM_sai; }

