#ifndef ZDISTA_WRAPPER_H
#define ZDISTA_WRAPPER_H

#include "mocks_extra.h"

// Na systemach Windows, musimy jawnie eksportować symbole, aby były widoczne w DLL.
#if defined(_WIN32) || defined(_WIN64)
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif

// Deklaracja nieprzezroczystej struktury (opaque struct).
// Dzięki temu, wewnętrzna budowa naszego "uchwytu" jest ukryta przed kodem Python.
struct ZDistA_handle;
typedef struct ZDistA_handle ZDistA_handle;

/**
 * @brief Inicjalizuje logikę przekaźnika i wszystkie wewnętrzne struktury.
 *
 * @param z1_r Rezystancja nastawcza strefy 1.
 * @param z1_x Reaktancja nastawcza strefy 1.
 * @param line_angle_deg Kąt linii w stopniach.
 * @param kierunek Kierunkowość (0: bezkierunkowy, 1: do linii, 2: do szyn).
 * @return Wskaźnik do "uchwytu" (handle) przechowującego stan przekaźnika, lub NULL w przypadku błędu.
 */
DLL_EXPORT ZDistA_handle* ZDistA_init(double z1_r, double z1_x, double line_angle_deg, int kierunek);

/**
 * @brief Wykonuje jeden krok obliczeniowy algorytmu.
 *
 * @param handle Uchwyt zwrócony przez ZDistA_init.
 * @param u_re Tablica 3 floatów (U1, U2, U3 - części rzeczywiste).
 * @param u_im Tablica 3 floatów (U1, U2, U3 - części urojone).
 * @param i_re Tablica 3 floatów (I1, I2, I3 - części rzeczywiste).
 * @param i_im Tablica 3 floatów (I1, I2, I3 - części urojone).
 * @return Wartość > 0, jeśli nastąpiło zadziałanie (trip), 0 w przeciwnym razie.
 */
DLL_EXPORT int ZDistA_step(
    ZDistA_handle* handle,
    const float u_re[3], const float u_im[3],
    const float i_re[3], const float i_im[3]
);

/**
 * @brief Zwalnia pamięć zaalokowaną dla uchwytu.
 *
 * @param handle Uchwyt do zwolnienia.
 */
DLL_EXPORT void ZDistA_cleanup(ZDistA_handle* handle);

#endif // ZDISTA_WRAPPER_H
