#include "lwip/opt.h"
#include "lwip/arch.h"
#include "lwip/api.h"

typedef enum
{
  SET_PAGE_IDLE = 0,
  SET_PAGE_PAGE1,
  SET_PAGE_PAGE2,
  SET_PAGE_PAGE3,
  SET_PAGE_PAGE4,
} SET_PAGE_t;

typedef enum
{
  SEND_REQUIRED_YES = 0,
  SEND_REQUIRED_NO,
  SEND_REQUIRED_FILE
} REQ_TYPE_t;

struct http_state
{
  char *file;
  u32_t left;
};

struct fs_file {
  char *data;
  int len;
};

void HTTP_Init();

static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err);
static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t err);




void http_server_netconn_init();

/**
  * @brief  Выводим запросы в консоль
  */
void vTaskPrintHttp(void *pvParameters);

/**
  * @brief  Установка даты производства
  */
void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

/**
  * @brief  Парсинг строки настроек
  */
void HTTP_SetSettings(char *buf, uint16_t lenBuf);

/**
  * @brief  
  */
void HTTP_SetInfo(char *buf, uint16_t lenBuf);

/**
  * @brief  
  */
int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

/**
  * @brief  
  */
int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);


int HTTP_UpsHistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

int HTTP_HistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

/**
  * @brief  Запуск/останов теста UPS
  */
void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

/**
  * @brief  Выклюение UPS
  */
void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

/**
  * @brief  Проверка пароля для перехода в режим bootloader
  */
void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

/**
  * @brief  Проверка пароля для входа в Web
  */
int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);

void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut);

/**
  * @brief  
  */
uint8_t GetParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen);

uint8_t GetCookieValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen);

/**
  * @brief  
  * @retval None
  */
uint8_t GetParamValueInEnd(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen);

void ClearParamString(char *inBuf);

/**
  * @brief  Замена символа в строке
  * @param  *str - входная строка
  * @param  sim1 - символ который надо заменить
  * @param  sim2 - символ на который надо заменить
  */
void HTTP_ReplaceSimbol(char *str, char sim1, char sim2);
