use std::sync::mpsc::{channel, Receiver, Sender};
use std::sync::{Arc, Mutex};
use crate::option::PacketCaptureOptions;
use crate::packet::PacketFrame;
use crate::pcap::start_capture;
#[derive(Debug)]
pub struct Listner {
    pub options: PacketCaptureOptions,
    pub tx: Arc<Mutex<Sender<PacketFrame>>>,
    pub rx: Arc<Mutex<Receiver<PacketFrame>>>,
    pub stop: Arc<Mutex<bool>>,
    pub packets: Arc<Mutex<Vec<PacketFrame>>>,
}
impl Listner {
    pub fn new(options: PacketCaptureOptions) -> Listner {
        let (tx, rx) = channel();
        let listener: Listner = Listner {
            options: options,
            tx: Arc::new(Mutex::new(tx)),
            rx: Arc::new(Mutex::new(rx)),
            stop: Arc::new(Mutex::new(false)),
            packets: Arc::new(Mutex::new(Vec::new())),
        };
        listener
    }
    pub fn get_receiver(&self) -> Arc<Mutex<Receiver<PacketFrame>>> {
        self.rx.clone()
    }
    
    pub fn get_stop_handle(&self) -> Arc<Mutex<bool>> {
        self.stop.clone()
    }
    pub fn get_packets(&self) -> Vec<PacketFrame> {
        self.packets.lock().unwrap().clone()
    }
    
    pub fn start(&self) {
        let options = self.options.clone();
        let packets: Vec<PacketFrame> = start_capture(options, &self.tx, &self.stop);
        for packet in packets {
            self.packets.lock().unwrap().push(packet);
        }
    }
}