#ifndef __DY_SOCKET_SESSION_H
#define __DY_SOCKET_SESSION_H
#include <arpa/inet.h>
#include <pthread.h>
#include "lnxall_list.h"
#include "dy_common.h"

#define SOCKET_DO_RCV_MASK (1 << 1)
#define SOCKET_DO_SND_MASK (1 << 2)

/*************ENUM*************************/
typedef enum
{
    SOCKET_TCP,
    SOCKET_UDP,
    SOCKET_MQTT,
} socket_type_e;

typedef enum
{
    SOCKET_CONNECTING = 0, // 正在连接
    SOCKET_CONNECTED, // 已连接
    SOCKET_DISCONNECTED, //主动断开连接
} socket_state_e;
/******************************************/

typedef struct socket_data_node_s
{
    struct list_head list;
    int buf_len;
    char buf[0];
} socket_data_node_t;

typedef struct socket_session_s
{
    struct list_head rcv_list; //收到的消息列表
    struct list_head snd_list; //待发送队列
    socklen_t socklen;
    socket_state_e state;
    struct sockaddr_in server_addr;
    int (*handle_recv_msg)(void *obj, char *buf, int len);
    int (*connect_state_change)(void *obj, socket_state_e state); // 连接状态变化时调用的callback函数
    pthread_mutex_t sock_lock;
    pthread_cond_t sock_cond;
    socket_type_e type;
    int sockfd;
    int op_code;
    char socket_server_addr[32];
    int socket_server_port;
    int send_cnt;
    void *user_data;
    bool short_conn;
} socket_session_t;

extern int dy_socket_session_snd(socket_session_t *session, char *buf, int len);
extern socket_session_t *dy_socket_session_init(socket_type_e type, char *addr, int port,
                                         int (*handle_recv_msg)(void *obj, char *buf, int len),
                                         int (*connect_state_change)(void *obj, socket_state_e state),
                                         void *user_data);
extern socket_state_e dy_socket_session_get_state(socket_session_t *session);

extern int dy_socket_recv(socket_type_e type, int socket, unsigned char *buf, int max_len, int timeout);
extern int dy_socket_creat_conn(socket_type_e type, char *addr, int port);
extern int dy_socket_send_buf(socket_type_e type, int socket, unsigned char *buf, int len);

#endif
