local Sound = {}
function Sound:new(vowel)
	self.vowel = vowel or "a"
    return setmetatable({}, {__index = self})
end
function Sound:default(stem1, stem2)
	local v = self.vowel
    return {
        v..stem1, 
        "t"..v..stem1, 
        "t"..v..(stem2 or stem1).."ī", 
        "i"..stem1, 
        "ni"..stem1, 
        "t"..v..(stem2 or stem1).."ā", 
        "i"..(stem2 or stem1).."ū",
        "i"..(stem2 or stem1).."ā", 
    }
end
function Sound:imp(s)
    return {
        "lu"..s.pret1, 
        s.imp2, 
        s.imp1.."ī",
        "li"..s.pret1,
        "i ni"..s.pret1,
        s.imp1.."ā",
        "li"..s.pret2.."ū",
        "li"..s.pret2.."ā",
        
    }  
end
function Sound:dur(stem1, stem2)
    return self:default(stem1, stem2)
end
    
function Sound:perf(stem1, stem2)
    return self:default(stem1, stem2)
end
    
function Sound:pret(stem1, stem2)
    return self:default(stem1, stem2)
end
function Sound:nominal(stem)
    return stem.."um"
end


----------------------------------------------------------
--------------------|   I-a verbs    |--------------------
----------------------------------------------------------
local Ia = setmetatable({}, {__index = Sound})
function Ia:pret(stem1, stem2) 
    return {
        "ā"..stem1, 
        "tā"..stem1 , 
        "tā"..stem2.."ī", 
        "ī"..stem1, 
        "nī"..stem1, 
        "tā"..stem2.."ā", 
        "ī"..stem2.."ū",
        "ī".. stem2.."ā" 
    }
end
function Ia:imp(s) 
	return {
        "lū"..s.pret1, 
        s.imp2, 
        s.imp1.."ī",
        "lī"..s.pret1,
        "i nī"..s.pret1,
        s.imp1.."ā",
        "lī"..s.pret2.."ū",
        "lī"..s.pret2.."ā",
        
    }  
end
function Ia:perf(stem1, stem2) 
    return self:pret(stem1, stem2)
end


----------------------------------------------------------
-------------------|   I-e verbs    |---------------------
----------------------------------------------------------
local Ie = setmetatable({}, {__index = Sound})
function Ie:dur(stem1, stem2)
    return {
        "e"..stem1, 
        "te"..stem1, 
        "te"..stem2.."ī", 
        "i"..stem1, 
        "ni"..stem1, 
        "te"..stem2.."ā", 
        "i"..stem1.."ū",
        "i"..stem1.."ā", 
    }
end
function Ie:pret(stem1, stem2)
    return {
        "ē"..stem1, 
        "tē"..stem1, 
        "tē"..stem2.."ī", 
        "ī"..stem1, 
        "nī"..stem1, 
        "tē"..stem2.."ā", 
        "ī"..stem2.."ū",
        "ī"..stem2.."ā", 
    }
end
function Ie:perf(stem1, stem2) 
    return self:pret(stem1, stem2)
end
function Ie:imp(s) 
	return {
        "lū"..s.pret1, 
        s.imp2, 
        s.imp1.."ī",
        "lī"..s.pret1,
        "i nī"..s.pret1,
        s.imp1.."ā",
        "lī"..s.pret2.."ū",
        "lī"..s.pret2.."ā",
        
    }  
end

----------------------------------------------------------
-------------------|   I-n verbs    |---------------------
----------------------------------------------------------
local In = setmetatable({}, {__index = Sound})


----------------------------------------------------------
-------------------|   I-w verbs    |---------------------
----------------------------------------------------------
local Iwa = setmetatable({}, {__index = Sound})

function Iwa:default(stem1, stem2)
    return {
        "u"..stem1, 
        "tu"..stem1, 
        "tu"..stem2.."ī", 
        "u"..stem1, 
        "nu"..stem1, 
        "tu"..stem2.."ā", 
        "u"..stem2.."ū",
        "u"..stem2.."ā", 
    }
end
Iwa.perf = Sound.default


local Iwi = setmetatable({}, {__index = Sound})

function Iwi:perf(stem1, stem2) 
    return self:pret(stem1, stem2)
end
function Iwi:pret(stem1, stem2)
    return {
        "ē"..stem1, 
        "tē"..stem1, 
        "tē"..stem2.."ī", 
        "ī"..stem1, 
        "nī"..stem1, 
        "tē"..stem2.."ā", 
        "ī"..stem2.."ū",
        "ī"..stem2.."ā", 
    }
end
function Iwi:dur(stem1, stem2)
    return {
        "e"..stem1, 
        "te"..stem1, 
        "te"..stem2.."ī", 
        "i"..stem1, 
        "ni"..stem1, 
        "te"..stem2.."ā", 
        "i"..stem1.."ū",
        "i"..stem1.."ā", 
    }
end
function Iwi:imp(s) 
	return {
        "-", 
        "-", 
        "-",
        "-",
        "-",
        "-",
        "-",
        "-",
    }  
end

----------------------------------------------------------
---------------------   II-a verbs    --------------------
----------------------------------------------------------
local IIa = setmetatable({}, {__index = Sound})


----------------------------------------------------------
---------------------   II-e verbs    --------------------
----------------------------------------------------------
local IIe = setmetatable({}, {__index = Sound})
function IIe:default(stem1, stem2)
    return {
        "e"..stem1, 
        "te"..stem1, 
        "te"..stem2.."ī", 
        "i"..stem1, 
        "ni"..stem1, 
        "te"..stem2.."ā", 
        "i"..stem2.."ū",
        "i"..stem2.."ā", 
    }
end

----------------------------------------------------------
---------------------   III-a verbs    -------------------
----------------------------------------------------------
local IIIa = setmetatable({}, {__index = Sound})
function IIIa:default(stem1, stem2)
    return {
        "a"..stem1.."a", 
        "ta"..stem1.."a", 
        "ta"..(stem2 or stem1).."î", 
        "i"..stem1.."a", 
        "ni"..stem1.."a", 
        "ta"..(stem2 or stem1).."â", 
        "i"..(stem2 or stem1).."û",
        "i"..(stem2 or stem1).."â", 
    }
end
function IIIa:imp(s)
    return {
        "lu"..s.pret1.."a", 
        s.imp2.."a", 
        s.imp1.."î",
        "li"..s.pret1.."a",
        "i ni"..s.pret1.."a",
        s.imp1.."â",
        "li"..s.pret2.."û",
        "li"..s.pret2.."â",
    }  
end
function IIIa:nominal(stem)
    return stem.."ûm"
end

----------------------------------------------------------
---------------------   III-j verbs    -------------------
----------------------------------------------------------
local IIIj = setmetatable({}, {__index = IIIa})
function IIIj:default(stem1, stem2)
    return {
        "a"..stem1.."i", 
        "ta"..stem1.."i", 
        "ta"..(stem2 or stem1).."î", 
        "i"..stem1.."i", 
        "ni"..stem1.."i", 
        "ta"..(stem2 or stem1).."iā", 
        "i"..(stem2 or stem1).."û",
        "i"..(stem2 or stem1).."iā", 
    }
end
function IIIj:imp(s)
    return {
        "lu"..s.pret1.."i", 
    	s.imp2.."i", 
        s.imp1.."î",
        "li"..s.pret1.."i",
        "i ni"..s.pret1.."i",
        s.imp1.."iā",
        "li"..s.pret2.."û",
        "li"..s.pret2.."iā",
    }  
end


----------------------------------------------------------
---------------------   III-w verbs    -------------------
----------------------------------------------------------
local IIIw = setmetatable({}, {__index = IIIa})
function IIIw:default(stem1, stem2)
    return {
        "a"..stem1.."u", 
        "ta"..stem1.."u", 
        "ta"..(stem2 or stem1).."î", 
        "i"..stem1.."u", 
        "ni"..stem1.."u", 
        "ta"..(stem2 or stem1).."â", 
        "i"..(stem2 or stem1).."û",
        "i"..(stem2 or stem1).."â", 
    }
end
function IIIw:imp(s)
    return {
        "lu"..s.pret1.."u", 
        s.imp2.."u", 
        s.imp1.."î",
        "li"..s.pret1.."u",
        "i ni"..s.pret1.."u",
        s.imp1.."â",
        "li"..s.pret2.."û",
        "li"..s.pret2.."â",
    }  
end

----------------------------------------------------------
---------------------   III-e verbs    -------------------
----------------------------------------------------------
local IIIe = setmetatable({}, {__index = IIIa})
function IIIe:default(stem1, stem2)
    return {
        "e"..stem1.."e", 
        "te"..stem1.."e", 
        "te"..(stem2 or stem1).."î", 
        "i"..stem1.."e", 
        "ni"..stem1.."e", 
        "te"..(stem2 or stem1).."eā", 
        "i"..(stem2 or stem1).."û",
        "i"..(stem2 or stem1).."eā", 
    }
end
function IIIe:imp(s)
    return {
        "lu"..s.pret1.."e", 
        s.imp2.."e", 
        s.imp1.."î",
        "li"..s.pret1.."e",
        "i ni"..s.pret1.."e",
        s.imp1.."eā",
        "li"..s.pret2.."û",
        "li"..s.pret2.."eā",
    }  
end

return function (weakness)
    if not weakness then
        return Sound:new()
    elseif weakness == "Sound e-i" then
    	return Sound:new("e")
    elseif weakness == "I-a" then
        return Ia:new()
    elseif weakness == "I-e" then
        return Ie:new()
    elseif weakness == "I-n" then
        return In:new()
    elseif weakness == "I-w ''a-i''" then
        return Iwa:new()
    elseif weakness == "I-w ''i''" then
        return Iwi:new()
    elseif weakness == "II-a" then
        return IIa:new()
    elseif weakness == "II-e" then
        return IIe:new()
    elseif weakness == "III-a" then
        return IIIa:new()
    elseif weakness == "III-y" then
        return IIIj:new()
    elseif weakness == "III-w" then
        return IIIw:new()
    elseif weakness == "III-e" then
        return IIIe:new()
    else
        error("Not yet implemented")
    end
end