package net.azib.ipscan.fetchers;

import net.azib.ipscan.core.ScanningSubject;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

import static net.azib.ipscan.fetchers.UnixMACFetcher.getLocalMAC;

public class LinuxMACFetcher extends MACFetcher {
	private static final Path ARP_TABLE = Path.of("/proc/net/arp");
	private int flagsIndex;
	private int macIndex;
	private int macLength = 17;

	public LinuxMACFetcher() {
		var line = arpLines().findFirst().get();
		flagsIndex = line.indexOf("Flags");
		macIndex = line.indexOf("HW addr");
	}

	private static Stream<String> arpLines() {
		try {
			return Files.lines(ARP_TABLE);
		} catch (Exception e) {
			return Stream.empty();
		}
	}

	@Override public String resolveMAC(ScanningSubject subject) {
		try {
			var ip = subject.getAddress().getHostAddress();
			return arpLines()
				.filter(line -> line.startsWith(ip + " ") && !line.substring(flagsIndex, flagsIndex + 3).equals("0x0")).findFirst()
				.map(line -> line.substring(macIndex, macIndex + macLength).toUpperCase())
				.orElse(getLocalMAC(subject));
		}
		catch (Exception e) {
			return null;
		}
	}
}
