#ifndef Scan_h
#define Scan_h

#include "Arduino.h"
#include "Accesspoints.h"
#include "Stations.h"
#include "Names.h"
#include "SSIDs.h"
#include "Settings.h"
#include "language.h"

#define SCAN_MODE_OFF 0
#define SCAN_MODE_APS 1
#define SCAN_MODE_STATIONS 2
#define SCAN_MODE_ALL 3
#define SCAN_MODE_SNIFFER 4
#define SCAN_DEFAULT_TIME 15000
#define SCAN_DEFAULT_CONTINUE_TIME 10000
#define SCAN_PACKET_LIST_SIZE 64

extern Accesspoints accesspoints;
extern Stations stations;
extern Names names;
extern SSIDs ssids;
extern Settings settings;
extern uint8_t wifiMode;

extern void setWifiChannel(uint8_t ch);
extern bool appendFile(String path, String &buf);
extern bool writeFile(String path, String &buf);
extern void readFileToSerial(const String path);
extern void resumeAP();
extern void stopAP();
extern String escape(String str);

class Scan {
  public: 
    Scan();

    void sniffer(uint8_t* buf, uint16_t len);
    void start(uint8_t mode, uint32_t time, uint8_t nextmode, uint32_t continueTime, bool channelHop, uint8_t channel);
    void start(uint8_t mode);

    void setup();
    void update();
    void stop();
    void save(bool force);
    void save(bool force, String filePath);
    
    void selectAll();
    void deselectAll();
    void printAll();
    void printSelected();

    uint8_t getPercentage();
    uint32_t getPackets(int i);
    uint32_t countAll();
    uint32_t countSelected();
    bool isScanning();
    bool isSniffing();

    void nextChannel();
    void setChannel(uint8_t newChannel);
    
    double getScaleFactor(uint8_t height);
    uint32_t getMaxPacket();
    uint32_t getPacketRate();
    
    uint16_t deauths = 0;
    uint16_t packets = 0;
  private:
    LinkedList<uint16_t>* list;              // packet list
   
    uint32_t sniffTime = SCAN_DEFAULT_TIME; // how long the scan runs
    uint32_t snifferStartTime = 0;          // when the scan started
    uint32_t snifferOutputTime = 0;         // last info output (every 3s)
    uint32_t snifferChannelTime = 0;        // last time the channel was changed
    uint32_t snifferPacketTime = 0;         // last time the packet rate was reseted (every 1s)

    uint8_t scanMode = 0;
    
    uint8_t scan_continue_mode = 0;                     // restart mode after scan stopped
    uint32_t continueTime = SCAN_DEFAULT_CONTINUE_TIME; // time in ms to wait until scan restarts
    uint32_t continueStartTime = 0;                     // when scan restarted
    
    bool channelHop = true;
    uint16_t tmpDeauths = 0;
    
    bool apWithChannel(uint8_t ch);
    int findAccesspoint(uint8_t* mac);

    String FILE_PATH = "/scan.json";
};

#endif



