local string=mw.ustring


local function cite(frame)
	local b,c,v,p,s,q,txt,book_id,u
	local args = {}
	local targs = {}


	for k, v in pairs(frame.args) do
		if v ~= "" then args[k] = v end
	end
	for k, v in pairs(frame:getParent().args) do
		if v ~= "" then args[k] = v end
	end
    local expand = args.expand
	
	local function myerror(txt)
		if expand == "json" then
			return mw.text.jsonEncode({
				error = txt
			});
		else
			return error(txt)
		end	
	end
	
	txt = args[1]
	if string.find(txt,'https://shamela.ws/book/') ~= nil then
		local q,c,u,ch,p,v
		if 	string.match(txt,'^([^\n]+)[\n ]%-%-%-%-%-%-%-%-[\n ]([^\n]+) %- المكتبة الشاملة[\n ]%-%-%-%-%-%-%-%-[\n ]الرابط:(https://shamela.ws/book/%d+/%d+#p%d+)$') then
			q,c,u = string.match(txt,'^([^\n]+)[\n ]%-%-%-%-%-%-%-%-[\n ]([^\n]+) %- المكتبة الشاملة[\n ]%-%-%-%-%-%-%-%-[\n ]الرابط:(https://shamela.ws/book/%d+/%d+#p%d+)$')
		elseif string.match(txt,'(ص[^\n]+) %- المكتبة الشاملة[\n ]%-%-%-%-%-%-%-%-[\n ]الرابط:(https://shamela.ws/book/%d+/%d+#p%d+)$') then
			c,u = string.match(txt,'(ص[^\n]+) %- المكتبة الشاملة[\n ]%-%-%-%-%-%-%-%-[\n ]الرابط:(https://shamela.ws/book/%d+/%d+#p%d+)$')
		elseif string.match(txt,'(https://shamela.ws/book/%d+/%d+#p%d+)$') or string.match(txt,'(https://shamela.ws/book/%d+/%d+)$') or string.match(txt,'(https://shamela.ws/book/%d+)$') then
			u = string.match(txt,'(https://shamela.ws/book/%d+/%d+#p%d+)$') or string.match(txt,'(https://shamela.ws/book/%d+/%d+)$') or string.match(txt,'(https://shamela.ws/book/%d+)$')
		else
			return myerror('صيغة غير قياسية')
		end
		
		book_id = string.match(u,'^https://shamela.ws/book/(%d+)$') or string.match(u,'^https://shamela.ws/book/(%d+)/')
		if not book_id then
			return myerror("تحقق من رابط الموقع")
		else
			book_id=tonumber(book_id)
			if c and string.match(u,'^https://shamela.ws/book/(%d+)/(%d+)') then
				p,ch = string.match(c,'^ص([^\n ]+) %- [^\n]+ %- ([^\n%-]+)$')
				if ch then
					targs['chapter-url'] = u
					targs.chapter = ch
				else
					targs.url= u 
				end
				if p then
					targs.page= p
					v = args['volume'] or args['ج'] or args['vol'] or args['المجلد'] or args['الجزء']
					if v then
						targs.volume=v
					end
				end
			else
				targs['url'] = u
			end

			if q then
				targs.quote = q
				targs.via = '[[المكتبة الشاملة]]'
			end
			local tp=args['page'] or args['ص'] or args['p'] or args['الصفحة'] or args['صفحة']
			if tp then
				targs.page= tp
			end

			local tv = args['volume'] or args['ج'] or args['vol'] or args['المجلد'] or args['الجزء']
			if tv then
				targs.volume=tv
			end

			
		end
	else
		q = string.match(txt,':[%s\n]*«([^%)]+)»$')
		if q then
			targs.quote = q
			targs.via = '[[المكتبة الشاملة]]'
		end
		b,c = string.match(txt,'^([^%(0-9]+) %(([^%)]+)%)')

		if not b then
			return myerror("صيغة غير قياسية")
		elseif string.sub(b,1,1) == '«' and string.sub(b,-1,-1) == '»' then
			b = mw.text.trim(string.sub(b,2,-2))
		end

		if c then
			if string.match(c,'^ص(%d+)$') then
				p = string.match(c,'^ص(%d+)$')
			elseif string.match(c,'^ص(%d+) ([ء-ي].+)$') then
				p,s = string.match(c,'^ص(%d+) ([ء-ي].+)$')
			elseif string.match(c,'^([^/]+)/ (%d+)$') then
				v,p = string.match(c,'^([^/]+)/ (%d+)$')
			elseif string.match(c,'^([^/]+)/ (%d+) ([ء-ي].+)$') then
				v,p,s = string.match(c,'^([^/]+)/ (%d+) ([ء-ي].+)$')
			else
				return myerror("صيغة غير قياسية")
			end
			if p then
				targs.page = p
			end
			if v then
				targs.volume = v
			end
		end
		mw.log(txt,b,c,v,p,s,q)
	end
	
	if b or book_id then
		shamela = mw.loadJsonData('Module:Cite Shamela/data.json')
		if book_id then
			for k,v in pairs(shamela) do
				if v.id == book_id then
					b = v.name
					targs.qid = v.q
					break
				end
			end
		elseif b then

			for k,v in pairs(shamela) do
				if (v.pre or v.name) == b and s == v.suf then
					book_id = v.id
					targs.qid = v.q
					break
				end
			end
		end
	end
	if targs.qid == nil then
		return myerror('لم يعثر على بيانات الكتاب في ويكي بيانات')
	end

    if expand == "json" then
		local params = {}
		for idx, val in pairs(targs) do
			params[idx] = { wt = val}
		end
		return mw.text.jsonEncode({
			template = {
				target= {
					href = "Template:استشهاد بويكي بيانات",
					wt= "استشهاد بويكي بيانات"
				},
				params = params
			}
		});
	elseif expand then
		local expand_args = { "{{استشهاد بويكي بيانات"  }		-- init with citation template
		-- add contents to expand_args
		for idx, val in pairs(targs) do
			table.insert(expand_args, idx .. '=' .. val )
		end
		-- make the nowiki'd string and done
		return table.concat (expand_args, '| ') .. "}}"
	end

    return table.concat ({frame:expandTemplate ({title='استشهاد بويكي بيانات/نسخ', args=targs}), '<!-- إخراج تلقائي من قالب:استشهاد بالشاملة -->'})
	
end



return { 
	cite = cite
}