#ifndef BIBLIOTEKA_H
#define BIBLIOTEKA_H

#include "mavka/tsil.h"

// мат
р64 бібліотека_мавки_Е_р64();

р64 бібліотека_мавки_ЛОГ10_р64();

р64 бібліотека_мавки_ЛОГ2_р64();

р64 бібліотека_мавки_ЛОГ2Е_р64();

р64 бібліотека_мавки_ЛОГ10Е_р64();

р64 бібліотека_мавки_ПІ_р64();

р64 бібліотека_мавки_КОРІНЬ1_2_р64();

р64 бібліотека_мавки_КОРІНЬ2_р64();

р64 бібліотека_мавки_синус_р64(р64 значення);

р64 бібліотека_мавки_косинус_р64(р64 значення);

р64 бібліотека_мавки_тангенс_р64(р64 значення);

р64 бібліотека_мавки_арксинус_р64(р64 значення);

р64 бібліотека_мавки_арккосинус_р64(р64 значення);

р64 бібліотека_мавки_арктангенс_р64(р64 значення);

р64 бібліотека_мавки_арктангенс2_р64(р64 а, р64 б);

р64 бібліотека_мавки_абсолютне_р64(р64 значення);

р64 бібліотека_мавки_експонента_р64(р64 значення);

р64 бібліотека_мавки_корінь2_р64(р64 значення);

р64 бібліотека_мавки_стеля_р64(р64 значення);

р64 бібліотека_мавки_підлога_р64(р64 значення);

р64 бібліотека_мавки_округлити_р64(р64 значення);

р64 бібліотека_мавки_остача_від_ділення_р64(р64 а, р64 б);

р64 бібліотека_мавки_лог_р64(р64 значення);

р64 бібліотека_мавки_лог2_р64(р64 значення);

р64 бібліотека_мавки_лог10_р64(р64 значення);

// афс
void бібліотека_мавки_афс_видалити(п8* дані_шляху,
                                   природне розмір_шляху,
                                   void (*обробник)(природне видалено,
                                                    природне помилка,
                                                    адреса аргумент),
                                   адреса аргумент);

void бібліотека_мавки_афс_дописати(п8* дані_шляху,
                                   природне розмір_шляху,
                                   п8* дані_даних,
                                   природне розмір_даних,
                                   void (*обробник)(природне помилка,
                                                    адреса аргумент),
                                   адреса аргумент);

void бібліотека_мавки_афс_записати(п8* дані_шляху,
                                   природне розмір_шляху,
                                   п8* дані_даних,
                                   природне розмір_даних,
                                   void (*обробник)(природне помилка,
                                                    адреса аргумент),
                                   адреса аргумент);

void бібліотека_мавки_афс_прочитати(п8* дані_шляху,
                                    природне розмір_шляху,
                                    void (*обробник)(п8* дані_даних,
                                                     природне розмір_даних,
                                                     природне помилка,
                                                     адреса аргумент),
                                    адреса аргумент);

void бібліотека_мавки_афс_створити_папку(п8* дані_шляху,
                                         природне розмір_шляху,
                                         void (*обробник)(природне помилка,
                                                          адреса аргумент),
                                         адреса аргумент);

// інет
#define МАВКА_ІНЕТ_УСПІХ 0
#define МАВКА_ІНЕТ_ПОМИЛКА_НЕВІДОМА 1000
#define МАВКА_ІНЕТ_ПОМИЛКА_НЕДОСТАТНЬО_ПАМʼЯТІ 1001
#define МАВКА_ІНЕТ_ПОМИЛКА_АРГУМЕНТУ 1002
#define МАВКА_ІНЕТ_ПОМИЛКА_АДРЕСА_ВИКОРИСТОВУЄТЬСЯ 1003
#define МАВКА_ІНЕТ_ПОМИЛКА_ЗʼЄДНАННЯ_ВІДХИЛЕНО 1004
#define МАВКА_ІНЕТ_ПОМИЛКА_ЗʼЄДНАННЯ_СКИНОТО 1005
#define МАВКА_ІНЕТ_ПОМИЛКА_МЕРЕЖА_НЕДОСТУПНА 1006
#define МАВКА_ІНЕТ_ПОМИЛКА_ХОСТ_НЕДОСТУПНИЙ 1007
#define МАВКА_ІНЕТ_ПОМИЛКА_ТАЙМАУТ 1008
#define МАВКА_ІНЕТ_ПОМИЛКА_КАНАЛ_ЗЛАМАНО 1009
#define МАВКА_ІНЕТ_ПОМИЛКА_ДОСТУПУ 1010
#define МАВКА_ІНЕТ_ПОМИЛКА_ЗАБАГАТО_ФАЙЛІВ 1011
#define МАВКА_ІНЕТ_ПОМИЛКА_АДРЕСА_НЕДОСТУПНА 1012
#define МАВКА_ІНЕТ_ПОМИЛКА_ПЕРЕПОВНЕННЯ_БУФЕРА 1013
#define МАВКА_ІНЕТ_ПОМИЛКА_МЕРЕЖА_ВІДМОВИЛА 1014
#define МАВКА_ІНЕТ_ПОМИЛКА_МЕРЕЖА_СКИНУТА 1015
#define МАВКА_ІНЕТ_ПОМИЛКА_ЗʼЄДНАННЯ_ПЕРЕРВАНО 1016
#define МАВКА_ІНЕТ_ПОМИЛКА_ВЖЕ_ПІДДОСЛІДЖЕНО 1017
#define МАВКА_ІНЕТ_ПОМИЛКА_НЕ_ПІДʼЄДНАНО 1018
#define МАВКА_ІНЕТ_ПОМИЛКА_ВХІД_ВИХІД 1019
#define МАВКА_ІНЕТ_ПОМИЛКА_НЕПРАВИЛЬНИЙ_ФАЙЛ 1020

#define БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП4 4
#define БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП6 6

// інет слуга
typedef void (*БібліотекаМавкиІнетСлугаОбробникЗапуску)(адреса адр_слуга,
                                                        природне помилка);
typedef void (*БібліотекаМавкиІнетСлугаОбробникПомилки)(адреса адр_слуга,
                                                        природне помилка);
typedef void (*БібліотекаМавкиІнетСлугаОбробникЗупинки)(адреса адр_слуга);
typedef void (*БібліотекаМавкиІнетСлугаОбробникЗнищення)(адреса аргумент);
typedef void (*БібліотекаМавкиІнетСлугаОбробникПідключенняЗвʼязку)(
    адреса адр_слуга,
    адреса адр_звʼязок);
typedef void (*БібліотекаМавкиІнетСлугаОбробникДанихЗвʼязку)(адреса адр_слуга,
                                                             адреса адр_звʼязок,
                                                             п8* дані,
                                                             природне розмір);
typedef void (*БібліотекаМавкиІнетСлугаОбробникСтіканняЗвʼязку)(
    адреса адр_слуга,
    адреса адр_звʼязок);
typedef void (*БібліотекаМавкиІнетСлугаОбробникЗакінченняЗвʼязку)(
    адреса адр_слуга,
    адреса адр_звʼязок);
typedef void (*БібліотекаМавкиІнетСлугаОбробникПомилкиЗвʼязку)(
    адреса адр_слуга,
    адреса адр_звʼязок,
    природне помилка);
typedef void (*БібліотекаМавкиІнетСлугаОбробникВідключенняЗвʼязку)(
    адреса адр_слуга,
    адреса адр_звʼязок);

void бібліотека_мавки_інет_служити(
    природне іа_вид,
    п8* іа_дані,
    природне іа_розмір,
    природне порт,
    БібліотекаМавкиІнетСлугаОбробникЗапуску обробник_запуску,
    БібліотекаМавкиІнетСлугаОбробникПомилки обробник_помилки,
    БібліотекаМавкиІнетСлугаОбробникЗупинки обробник_зупинки,
    адреса аргумент,
    БібліотекаМавкиІнетСлугаОбробникЗнищення обробник_знищення,
    БібліотекаМавкиІнетСлугаОбробникПідключенняЗвʼязку
        обробник_підключення_звʼязку,
    БібліотекаМавкиІнетСлугаОбробникДанихЗвʼязку обробник_даних_звʼязку,
    БібліотекаМавкиІнетСлугаОбробникСтіканняЗвʼязку обробник_стікання_звʼязку,
    БібліотекаМавкиІнетСлугаОбробникЗакінченняЗвʼязку
        обробник_закінчення_звʼязку,
    БібліотекаМавкиІнетСлугаОбробникПомилкиЗвʼязку обробник_помилки_звʼязку,
    БібліотекаМавкиІнетСлугаОбробникВідключенняЗвʼязку
        обробник_відключення_звʼязку);

адреса бібліотека_мавки_інет_отримати_аргумент_слуги(адреса адр_слуга);

void бібліотека_мавки_інет_зупинити_слугу(адреса адр_слуга,
                                          природне закрити_підключення);

// інет клієнт
typedef void (*БібліотекаМавкиІнетКлієнтОбробникПідключення)(адреса адр_звʼязок,
                                                             природне помилка);
typedef void (*БібліотекаМавкиІнетКлієнтОбробникДаних)(адреса адр_звʼязок,
                                                       п8* дані,
                                                       природне розмір);
typedef void (*БібліотекаМавкиІнетКлієнтОбробникСтікання)(адреса адр_звʼязок);
typedef void (*БібліотекаМавкиІнетКлієнтОбробникЗакінчення)(адреса адр_звʼязок);
typedef void (*БібліотекаМавкиІнетКлієнтОбробникПомилки)(адреса адр_звʼязок,
                                                         природне помилка);
typedef void (*БібліотекаМавкиІнетКлієнтОбробникВідключення)(
    адреса адр_звʼязок);

typedef void (*БібліотекаМавкиІнетЗвʼязокОбробникЗнищення)(
    адреса аргумент_звʼязку);
typedef void (*БібліотекаМавкиІнетЗвʼязокОбробникНадіслання)(
    адреса адр_звʼязок,
    адреса аргумент_надіслання);
typedef void (*БібліотекаМавкиІнетЗвʼязокОбробникЗакінчення)(
    адреса адр_звʼязок,
    адреса аргумент_закінчення);

void бібліотека_мавки_інет_підключитись(
    природне іа_вид,
    п8* іа_дані,
    природне іа_розмір,
    природне порт,
    БібліотекаМавкиІнетКлієнтОбробникПідключення обробник_підключення,
    БібліотекаМавкиІнетКлієнтОбробникДаних обробник_даних,
    БібліотекаМавкиІнетКлієнтОбробникСтікання обробник_стікання,
    БібліотекаМавкиІнетКлієнтОбробникЗакінчення обробник_закінчення,
    БібліотекаМавкиІнетКлієнтОбробникПомилки обробник_помилки,
    БібліотекаМавкиІнетКлієнтОбробникВідключення обробник_відключення,
    адреса аргумент,
    БібліотекаМавкиІнетЗвʼязокОбробникЗнищення обробник_знищення);

// returns 4 if IPv4
// returns 6 if IPv6
природне бібліотека_мавки_інет_отримати_іа_звʼязку(адреса адр_звʼязок,
                                                   природне* вихід_іа4,
                                                   п8* вихід_іа6);

void бібліотека_мавки_інет_записати_аргумент_звʼязку(
    адреса адр_звʼязок,
    адреса аргумент,
    БібліотекаМавкиІнетЗвʼязокОбробникЗнищення обробник_знищення);
адреса бібліотека_мавки_інет_отримати_аргумент_звʼязку(адреса адр_звʼязок);

// returns true when queued
// returns false when buffer is full
логічне бібліотека_мавки_інет_звʼязок_надіслати(
    адреса адр_звʼязок,
    п8* дані,
    природне розмір,
    адреса аргумент,
    БібліотекаМавкиІнетЗвʼязокОбробникНадіслання обробник);

void бібліотека_мавки_інет_звʼязок_закінчити(
    адреса адр_звʼязок,
    п8* дані,
    природне розмір,
    адреса аргумент,
    БібліотекаМавкиІнетЗвʼязокОбробникЗакінчення обробник);

void бібліотека_мавки_інет_звʼязок_знищити(адреса адр_звʼязок);

// хттп
typedef void (*БібліотекаМавкиХТТПВідклик)(ціле помилка,
                                           ціле код_статусу,
                                           п8* дані_тіла,
                                           природне розмір_тіла,
                                           адреса аргумент);

void бібліотека_мавки_хттп_гет(п8* дані_урл,
                               природне розмір_урл,
                               БібліотекаМавкиХТТПВідклик відклик,
                               адреса аргумент);

#endif // BIBLIOTEKA_H