#ifndef ACCENT_EXTRACT_CANDIDATES_H
#define ACCENT_EXTRACT_CANDIDATES_H

#include <stdbool.h>
#include <stddef.h>

#include "colour.h"
#include "arena.h"

typedef struct {
    RGB colour;
    Oklab lab;
    double red_sum;
    double green_sum;
    double blue_sum;
    double prevalence;
} ColourCluster;

typedef struct {
    ColourCluster *items;
    size_t count;
    size_t capacity;
    double merge_distance;
    Arena arena;
} CandidateSet;

typedef struct {
    RGB colour;
    double prevalence;
    float score;
} ScoredCandidate;

void candidates_init(CandidateSet *set);
void candidates_destroy(CandidateSet *set);
bool candidates_add(CandidateSet *set, RGB colour, double prevalence);
/* Results are owned by set and remain valid until candidates_destroy(). */
bool candidates_rank(CandidateSet *set, size_t limit, RGB background,
                     float minimum_score, ScoredCandidate **results,
                     size_t *result_count);
void candidates_tweak(ScoredCandidate *results, size_t result_count,
                      RGB background);

#endif