--gerekli modülleri yükleyelim
local olustur = require("Module:tr-nouns").olustur
local istisnaYumusama = require("Modül:tr-ad/istisnalar").istisnaYumusama
local lang = require("Module:languages").getByCode("ota")

local cekim = {}

--tüm verileri tabloya yerleştiren fonksiyon
function tablo(frame)
	--args'i tanıtalım
	local args = frame:getParent().args
	
	--ana parametreler
	local ad =  args["baş"] or mw.title.getCurrentTitle().text
	local it = args["istisna"]
	local okunus = args[1] or error("Lütfen sözcüğün okunuşunu şablona ekleyiniz.")
	
	local yalin = require("Modül:bağlantılar").tam_bag({dil = dil, sozcuk = ad}, "çeviri", false)
	
	return "<div class='NavFrame' style='width:65%'>"
		.. "<div class='NavHead' style='' >" .. yalin .. " <span style='color:#888'><b>(" .. okunus .. ")</b></span> adının çekimi</div>"
		.. "<div class='NavContent'>"
		.. "\n{| style='background:#F9F9F9; text-align:center; width:100%' class='çekim inflection-table'"
		.. "\n|-"
		.. "\n! style='width:33%;background:#DEDEDE' |"
		.. "\n! style='background:#DEDEDE' |'''[[tekil]]'''"
		.. "\n! style='background:#DEDEDE' |'''[[çoğul]]'''"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[yalın hâl|yalın]]'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "yalın","+", it)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "yalın","-", it)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[belirtme hâli|belirtme]]'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "belirtme","+", it)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "belirtme","-", it)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[yönelme hâli|yönelme]]'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "yönelme","+", it)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "yönelme","-", it)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[bulunma hâli|bulunma]]'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "bulunma","+", it)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "bulunma","-", it)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[ayrılma hâli|ayrılma]]'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "ayrılma","+", it)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "ayrılma","-", it)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[tamlayan hâli|tamlayan]]'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "tamlayan","+", it)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "tamlayan","-", it)
		.. "\n|-"
		.. "\n! colspan='3' style='background:#EFEFEF' |'''[[iyelik]]'''"
		.. "\n|-"
		.. "\n! style='width:33%;background:#EFEFEF' |"
		.. "\n! style='background:#EFEFEF' |'''[[tekil]]'''"
		.. "\n! style='background:#EFEFEF' |'''[[çoğul]]'''"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''1. tekil (benim)'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","+", it, 1)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","-", it, 1)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''2. tekil (senin)'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","+", it, 2)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","-", it, 2)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''3. tekil (onun)'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","+", it, 3)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","-", it, 3)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''1. çoğul (bizim)'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","+", it, 4)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","-", it, 4)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''2. çoğul (sizin)'''"
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","+", it, 5)
		.. "\n| style='color:black' |" .. islem(ad, okunus, "iyelik","-", it, 5)
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''3. çoğul (onların)'''"
		.. "\n| style='color:black' colspan='2' |" .. islem(ad, okunus, "iyelik","+", it, 6) .. "<br>" .. islem(ad, okunus, "iyelik","-", it, 6)
		.. "\n|}"
		.. "</div></div>"
end

--bir tabloya birden fazla veri eklemeye yarayan fonksiyon
function b(tablo, liste)
  for k, v in pairs(liste) do
    table.insert(tablo, v)
  end
end

--adların tüm çekimlemelerini halleden fonksiyon
function islem(ad, okunus, hal, tekil, it, kisi, cekim)
	--sonAd değeri, bu fonksiyonun en sonunda çıktıya vereceğimiz değer, bunu en başta ne olur ne olmaz
	--normal ad parametresine eşitleyelim
	local sonAd = ad
	--okunuşun son harfi bir çok yerde lazım olacak
	local sonHarf = mw.ustring.sub(okunus, -1)
	--sona gelen ekleri biriktireceğimiz tablo
	local h = {}
	
	--BAŞLAMADAN ÖNCE
	--b fonksiyonunu kullanarak eklenen ekler (sağdan sola doğru) sırasıyla yalın halin çoğulundan başlayarak
	--belirtme tekil-çoğul, yönelme tekil-çoğul, bulunma tekil-çoğul, ayrılma tekil-çoğul,
	--tamlayan tekil-çoğul ekleri ve son olarak da tüm iyelik kişi ekleri sırasıyla
	
	--bu kural sözcüğün sonu ه ile biten sözcüklerde geçerlidir
	if mw.ustring.sub(ad, -1) == "ه" then
		--eğer sözcüğün okunuşu h ile bitiyorsa:
		if sonHarf == "h" then
			b(h, {"لر","ی","لری","ه","لره","ده","لرده","دن","لردن","ڭ","لرڭ","م","لرم","ڭ","لرڭ","ی","لری","مز","لرمز","ڭز","لرڭز","ی","لری"})
		--eğer a veya e ile bitiyorsa:
		elseif mw.ustring.find(sonHarf, "[ae]") then
			b(h, {"‌لر","‌یی","‌لری","‌یه","‌لره","‌ده","‌لرده","‌دن","‌لردن","‌نڭ","‌لرڭ","‌م","‌لرم","‌ڭ","‌لرڭ","‌سی","‌لری","‌مز","‌لرمز","‌ڭز","‌لرڭز","‌سی","‌لری"})
		end
	--eğer sözcüğün okunuşu bir ünsüzle bitiyorsa bu kurallar geçerlidir:
	elseif mw.ustring.find(sonHarf, "[bcçdfgğhjklmnprsştvyzqxyz]") then
		--eğer sözcüğün sonu (okunuşuna göre) k ile bitiyor ve yumuşamaya uğruyorsa
		--Osmanlıca sözcüğün sonundaki ق harfi غ harfine, ك harfi de گ harfine dönüşür
		if sonHarf == "k" then
			if not istisnaYumusama[okunus] and (hal == "belirtme" or hal == "yönelme" or hal == "tamlayan" or hal == "iyelik") and tekil == "+" then
				sonAd = mw.ustring.sub( sonAd, 1, -2 ) .. (mw.ustring.sub(sonAd, -1) == "ق" and "غ" or mw.ustring.sub(sonAd, -1) == "ك" and "گ" or "")
			end
		end
		b(h, {"لر","ی","لری","ه","لره","ده","لرده","دن","لردن","ڭ","لرڭ","م","لرم","ڭ","لرڭ","ی","لری","مز","لرمز","ڭز","لرڭز","ی","لری"})
	--eğer sözcük bir ünlüyle bitiyorsa bu kurallar geçerlidir:
	elseif mw.ustring.find(sonHarf, "[aıouâeiöüî]") then
		suMu = okunus == "su"
		b(h, {"لر","یی","لری","یه","لره","ده","لرده","دن","لردن"})
		--burada okunuşu "su" olan sözcüğün bir istisnası bulunuyor
		if suMu then
			table.insert(h, "یڭ")
		else
			table.insert(h, "نڭ")
		end
		table.insert(h, "لرڭ")
		b(h, {(suMu and "ی" or "") .. "م","لرم",(suMu and "ی" or "") .. "ڭ","لرڭ",(suMu and "ی" or "س") .. "ی","لری",(suMu and "ی" or "") .. "مز","لرمز",(suMu and "ی" or "") .. "ڭز","لرڭز",(suMu and "ی" or "س") .. "ی","لری"})
	end
	
	--burada tüm hallerin tekil veya çoğul olma durumlarında sonlarına gelen ekler belirleniyor
	--birinciler tekil, ikinciler çoğulların sonuna gelen ekler
	if hal == "yalın" then sonAd = (tekil == "+" and sonAd or sonAd .. h[1])
	elseif hal == "belirtme" then sonAd = (tekil == "+" and sonAd .. h[2] or sonAd .. h[3])
	elseif hal == "yönelme" then sonAd = (tekil == "+" and sonAd .. h[4] or sonAd .. h[5])
	elseif hal == "bulunma" then sonAd = (tekil == "+" and sonAd .. h[6] or sonAd .. h[7])
	elseif hal == "ayrılma" then sonAd = (tekil == "+" and sonAd .. h[8] or sonAd .. h[9])
	elseif hal == "tamlayan" then sonAd = (tekil == "+" and sonAd .. h[10] or sonAd .. h[11])
	elseif hal == "iyelik" and kisi == 1 then sonAd = (tekil == "+" and sonAd .. h[12] or sonAd .. h[13])
	elseif hal == "iyelik" and kisi == 2 then sonAd = (tekil == "+" and sonAd .. h[14] or sonAd .. h[15])
	elseif hal == "iyelik" and kisi == 3 then sonAd = (tekil == "+" and sonAd .. h[16] or sonAd .. h[17])
	elseif hal == "iyelik" and kisi == 4 then sonAd = (tekil == "+" and sonAd .. h[18] or sonAd .. h[19])
	elseif hal == "iyelik" and kisi == 5 then sonAd = (tekil == "+" and sonAd .. h[20] or sonAd .. h[21])
	elseif hal == "iyelik" and kisi == 6 then sonAd = (tekil == "+" and sonAd .. h[22] or sonAd .. h[23])
	end
	
	--şimdi de okunuşları ayarlayalım
	local a = tekil == "+" and "tekil" or "çoğul"
	local harfler = {
		["yalın"] = {"","","",""},
		["belirtme"] = {"ı","i","u","ü"},
		["yönelme"] = {"a","e","a","e"},
		["bulunma"] = {"da","de","da","de"},
		["ayrılma"] = {"dan","den","dan","den"},
		["tamlayan"] = {"ı","i","u","ü"},
	}
	harfler["iyelik"] = kisi == 1 and {"m", "m", "m", "m"} or 
						kisi == 2 and {"n", "n", "n", "n"} or
						kisi == 3 and {"ı", "i", "u", "ü"} or
						kisi == 4 and {"mız", "miz", "muz", "müz"} or
						kisi == 5 and {"nız", "niz", "nuz", "nüz"} or
						kisi == 6 and {"ı", "i", "u", "ü"}
	local f = hal == "yönelme" and "belirtme" or (hal == "ayrılma" and "bulunma" or hal)
	
	okunus = ayarla(okunus, it, a, harfler[hal][1], harfler[hal][2], harfler[hal][3], harfler[hal][4], f)
	
	if cekim == "+" then
		return sonAd
	end
	
	return require("Modül:bağlantılar").tam_bag({dil = dil, sozcuk = sonAd}, "çeviri", true) .. "<br><span style='color:#888'>" .. okunus .. "</span>"
end

--bu fonksiyon [[Modül:çekim/şablonlar]] tarafından kullanılmaktadır
--burada yapacağınız değişiklikler sadece o modülü ilgilendirir
--Osmanlı Türkçesi dilindeki adlara gelen ekleri ayırt eden fonksiyon
function cekim_ota(args)
	--çekimlemesi yapılan sözcüğün yalın hali
	local ad = args[1]
	--asıl çekimleme, bu modül sadece çekimlemenin yapıldığı asıl
	--maddede kullanılacağı için direk sayfa adını alıyoruz
	local cekim = mw.title.getCurrentTitle()["text"]
	--osmanlı türkçesi sözcük çekimlerinde istisnai durumlar mevcut değil
	--fakat okunuş olarak girilen latin alfabesinde yazılan sözcüğün de
	--çekimlemelerde okunuşları devam edeceği için eğer latin yazılışta bir istisna olduysa
	--o girilmeli, bu istisnalar Modül:tr-ad/istisnalar sayfasında bulunabilir
	local it = args["istisna"]
	--ikinci parametre yalın sözcüğün okunuş parametresidir
	local okunus = args["tr"] or args["ç"]
	
	--otomatik çekimlemeler arasına virgül ekleyen fonksiyon
	local function virgul(tablo)
		if tablo[1] then
			table.insert(tablo, ";")
		end
	end
	
	if okunus then
		--tek tek tüm çekimlemeleri karşılaştırdığımız kısım
		--burada Modül:ota-ad'ın islem() fonksiyonu sayesinde
		--ilk parametrede girilen yalın sözcüğün tüm çekimlemelerini
		--çağırıp karşılaştırma yapabiliyoruz ve sonuç olarak ilgili açıklamaları ekliyoruz
		--islem() fonksiyonunun nasıl çalıştığını daha iyi anlamak için
		--ilgili modüle bakabilirsiniz
		cekimler = {"yalın", "belirtme", "yönelme", "bulunma", "ayrılma", "tamlayan"}
		for i, c in ipairs(cekimler) do
			if cekim == islem(ad, okunus, c,"+", it, nil, "+") then
				--eğer saptanan başka otomatik çekim varsa önce virgül eklemeliyiz
				virgul(args[3])
				table.insert(args[3], c)
				table.insert(args[3], "t")
			end
			if cekim == islem(ad, okunus, c,"-", it, nil, "+") then
				--eğer saptanan başka otomatik çekim varsa önce virgül eklemeliyiz
				virgul(args[3])
				if c == "yalın" then else
					table.insert(args[3], c)
				end
				table.insert(args[3], "ç")
			end
		end
		
		iyelik = {{1,"1t"},{2,"2t"},{3,"3t"},
				 {4,"1ç"},{5,"2ç"},{6,"3ç"}}
		for i, s in ipairs(iyelik) do
			if cekim == islem(ad, okunus, "iyelik","+", it, s[1], "+") then
				--eğer saptanan başka otomatik çekim varsa önce virgül eklemeliyiz
				virgul(args[3])
				table.insert(args[3], s[2])
				table.insert(args[3], "iyelik")
				table.insert(args[3], "t")
			end
			if cekim == islem(ad, okunus, "iyelik","-", it, s[1], "+") then
				--eğer saptanan başka otomatik çekim varsa önce virgül eklemeliyiz
				virgul(args[3])
				table.insert(args[3], s[2])
				table.insert(args[3], "iyelik")
				table.insert(args[3], "ç")
			end
		end
	end
end

return {tablo = tablo, islem = islem, cekim_ota = cekim_ota}