#!/usr/bin/lua

local sysconfig = require 'gluon.sysconfig'


if sysconfig.primary_mac then
	os.exit(0)
end


local json = require 'jsonc'
local platform = require 'gluon.platform'
local util = require 'gluon.util'


local function sysfs(...)
	local path = string.format(...)
	return function()
		local addr = util.readfile(path)
		if addr then
			return util.trim(addr)
		end
	end
end

local function eth(index)
	return sysfs('/sys/class/net/eth%d/address', index)
end

local function phy(index)
	return sysfs('/sys/class/ieee80211/phy%d/macaddress', index)
end

local function board(iface)
	return function()
		local data = json.load('/etc/board.json')
		if data and data.network and data.network[iface] then
			return data.network[iface].macaddr
		end
	end
end


-- Entries are matched in the order they are listed
local primary_addrs = {
	{eth(0), {
		{'x86'},
		{'brcm2708'},
		{'ar71xx', 'generic', {
			'a40',
			'a60',
			'archer-c25-v1',
			'archer-c60-v2',
			'archer-c7-v4',
			'archer-c7-v5',
			'carambola2',
			'koala',
			'mr600',
			'mr600v2',
			'mr900',
			'mr900v2',
			'mr1750',
			'mr1750v2',
			'om2p',
			'om2pv2',
			'om2pv4',
			'om2p-hs',
			'om2p-hsv2',
			'om2p-hsv3',
			'om2p-hsv4',
			'om2p-lc',
			'om5p',
			'om5p-an',
			'om5p-ac',
			'om5p-acv2',
			'unifi-outdoor-plus',
			'unifiac-lite',
			'unifiac-pro',
		}},
		{'ar71xx', 'mikrotik'},
		{'ar71xx', 'nand', {
			'hiveap-121',
		}},
		{'ath79', 'generic', {
			'glinet,gl-ar750s-nor',
			'ocedo,raccoon',
		}},
		{'ipq40xx', 'generic', {
			'avm,fritzbox-4040',
			'openmesh,a42',
			'openmesh,a62',
		}},
		{'mpc85xx', 'p1020', {
			'aerohive,hiveap-330',
		}},
		{'ramips', 'mt7620', {
			'miwifi-mini', 'tplink,c2-v1', 'c20-v1', 'c20i', 'c50',
		}},
	}},
	{eth(1), {
		{'ar71xx', 'generic', {
			'archer-c5',
			'archer-c58-v1',
			'archer-c59-v1',
			'archer-c60-v1',
			'archer-c7',
		}},
		{'ipq806x', 'generic', {
			'netgear,r7800',
		}},
		{'mpc85xx', 'p1020', {
			'ocedo,panda',
		}},
	}},
	{phy(1), {
		{'ar71xx', 'generic', {
			'tl-wdr3600',
			'tl-wdr4300',
			'tl-wr902ac-v1',
		}},
		{'ramips', 'mt7621', {
			'dir-860l-b1',
		}},
	}},
	{board('lan'), {
		{'lantiq', 'xway', {
			'netgear,dgn3500b',
		}},
	}},
	-- phy0 default
	{phy(0), {
		{}, -- matches everything
	}},
	-- eth0 fallback when phy0 does not exist
	{eth(0), {
		{}, -- matches everything
	}},
}


for _, matcher in ipairs(primary_addrs) do
	local f, matches = unpack(matcher)

	for _, match in ipairs(matches) do
		if platform.match(unpack(match)) then
			local addr = f()
			if addr then
				sysconfig.primary_mac = addr
				return
			end
		end
	end
end

error('no primary MAC address found')
