#pragma once

#include "subghz_protocol_common.h"

typedef struct SubGhzProtocolRAW SubGhzProtocolRAW;

/** Allocate SubGhzProtocolRAW
 * 
 * @return SubGhzProtocolRAW* 
 */
SubGhzProtocolRAW* subghz_protocol_raw_alloc();

/** Free SubGhzProtocolRAW
 * 
 * @param instance 
 */
void subghz_protocol_raw_free(SubGhzProtocolRAW* instance);

/** Reset internal state
 * @param instance - SubGhzProtocolRAW instance
 */
void subghz_protocol_raw_reset(SubGhzProtocolRAW* instance);

/** Get upload protocol
 * 
 * @param instance - SubGhzProtocolRAW instance
 * @param encoder - SubGhzProtocolCommonEncoder encoder
 * @return bool
 */
bool subghz_protocol_raw_send_key(
    SubGhzProtocolRAW* instance,
    SubGhzProtocolCommonEncoder* encoder);

/** Parse accepted duration
 * 
 * @param instance - SubGhzProtocolRAW instance
 * @param data - LevelDuration level_duration
 */
void subghz_protocol_raw_parse(SubGhzProtocolRAW* instance, bool level, uint32_t duration);

/** Outputting information from the parser
 *
 * @param instance - SubGhzProtocolRAW* instance
 * @param output   - output string
 */
void subghz_protocol_raw_to_str(SubGhzProtocolRAW* instance, string_t output);

const char* subghz_protocol_get_last_file_name(SubGhzProtocolRAW* instance);

void subghz_protocol_set_last_file_name(SubGhzProtocolRAW* instance, const char* name);

bool subghz_protocol_raw_save_to_file_init(
    SubGhzProtocolRAW* instance,
    const char* dev_name,
    uint32_t frequency,
    FuriHalSubGhzPreset preset);
void subghz_protocol_raw_save_to_file_stop(SubGhzProtocolRAW* instance);
bool subghz_protocol_raw_save_to_file_write(SubGhzProtocolRAW* instance);
size_t subghz_protocol_raw_get_sample_write(SubGhzProtocolRAW* instance);

bool subghz_protocol_raw_to_load_protocol_from_file(
    FileWorker* file_worker,
    SubGhzProtocolRAW* instance,
    const char* file_path);