-- Credits:
-- Original from fr:Module:Infobox/Fonctions
-- forked by وهراني @arwiki (ar:وحدة:بطاقة/أدوات)
-- Version: 20230705

-- أدوات مشتركة لبناء قوالب infobox
local localdata = require("وحدة:بطاقة/بيانات")
local item = localdata.item


local generic = {}
generic.description = {}

local xmath = require("Module:Math")

function FormatNumVal(value)
    value = tonumber(value)
    if value == 0 then
        return value
    end

    if (math.abs(value) > 1E15) then
        return xmath.round({precision = 3, value = value / 1E15}) .. " [[كوادريليون|بليار]]"
    elseif (math.abs(value) > 1E12) then
        return xmath.round({precision = 3, value = value / 1E12}) .. " [[تريليون]]"
    elseif (math.abs(value) > 1E9) then
        return xmath.round({precision = 3, value = value / 1E9}) .. " [[بليون]]"
    elseif (math.abs(value) > 1E6) then
        return xmath.round({precision = 3, value = value / 1E6}) .. " [[مليون]]"
    end

    return xmath.round({precision = 3, value = value})
end

local function getValue(val, params)
    if type(val) == "string" then
        return localdata[val]
    elseif type(val) == "function" then
        return val(localdata, localdata.item, params)
    elseif type(val) == "table" then
        for i, j in pairs(val) do -- في حال وجود قيم لأكثر من وسيط : أخذ بعين الاعتبار أول قيمة
            if localdata[j] then
                return localdata[j]
            end
        end
    end
end

generic.FormatNumVal = FormatNumVal

generic.description["title"] = "وضع لبنة «العنوان» وتحوي اسما مشارا إليه أو اسم المقالة.";
function generic.title(args)
    return {
        type = "title",
        suggested = true,
        value = {"اسم","الاسم","title","name"},
        wikidata = function()
            return (args and localdata[args.titleparam]) or
                (type(localdata.item) == "table" and type(localdata.item.id) == "string" and
                    mw.wikibase.label(localdata.item.id) and
                    mw.language.getContentLanguage():ucfirst(mw.wikibase.label(localdata.item.id))) or
                mw.title.getCurrentTitle().text
        end,
        subtitle = function()
            return args and localdata[args.subtitleparam]
        end,
        wikidatasubtitle = args and args.subtitlequery,
        icon = args and args.icon,
        style = args and args.style,
        metadata = {
			description = "عنوان أو اسم المقالة", 
			option = "", 
			type = "", 
        }
    }
end

generic.description["mainimage"] = " وضع لبنة «صورة» وتعرض صورة من المدخلات أو ويكي بيانات";
function generic.mainimage(params)
    if type(params) ~= "table" then
        params = {}
    end

    return {
        type = "images",
        suggested = true,
        wikidata = params.wikidata or {property = "P18"},
        imageparameters = params.imageparameters or {"صورة", "الصورة", "Image", "image"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat or params.cat or "مقالات تحتاج إلى صور",
        sizeparameter = params.sizeparameter or {"حجم الصورة", "حجم_الصورة", "عرض_الصورة"},
        uprightparameter = params.uprightparameter or "upright",
        defaultupright = params.upright,
        defaultsize = params.size,
        captionparameter = params.captionparameter or
            {
                "تعليق",
                "تعليق_الصورة",
                "تعليق الصورة",
                "عنوان_الصورة",
                "عنوان الصورة",
                "التعليق",
                "caption",
                "image_caption",
                "Caption"
            },
        altparameter = params.altparameter or "بديل الصورة" or "image_alt",
        defaultalt = params.alt,
        defaultimagealt = params.defaultimagealt,
        numval = 1,
        metadata = {
			description = " صورة تناسب الموضوع (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»).",
			example = "abc.jpg",
			option = "suggested", 
			type = "wiki-file-name", 
        }
    }
end

generic.description["logo"] = "وضع لبنة «الشعار المرسوم» وتعرض صورة الشعار.";
function generic.logo(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        wikidata = params.wikidata or {property = "P154"},
        imageparameters = params.imageparameters or {"شعار", "الشعار", "logo"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat,
        captionparameter = params.captionparameter or {"تعليق الشعار", "تعليق_الشعار"},
        defaultupright = params.upright or upright or "0.6",
        uprightparameter = params.uprightparameter or "upright logo",
        sizeparameter = params.sizeparameter or {"حجم الشعار", "عرض_الشعار"},
        numval = 1,
        defaultcaption = 'الشعار',
        metadata = {
			description = "صورة للشعار (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_logo.jpg",
			option = "suggested", 
			type = "wiki-file-name", 
        }
    }
end

generic.description["coat_of_arms"] = "إضافة صورة شعار النبالة";
function generic.coat_of_arms(params)
    if not params then
        params = {}
    end

    return {
        type = "images", 
        wikidata = params.wikidata or {property = {"P94"}},
        imageparameters = params.imageparameters 
             or {"شعار_النبالة",  "coat_of_arms"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat,
        captionparameter = params.captionparameter or
            {"تعليق نبالة",  "coat_of_arms_caption"},
        defaultupright = params.upright or upright or "0.8",
        uprightparameter = params.uprightparameter or {"upright coa"},
        sizeparameter = params.sizeparameter or {"coa_size"},
        numval = 1, 
        defaultcaption = 'شعار النبالة',
        metadata = {
			description = "صورة لشعار النبالة (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_coat.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end
generic.blason = generic.coat_of_arms

generic.description["seal"] = "إضافة صورة الختم";
function generic.seal(params)
    if not params then
        params = {}
    end

    return {
        type = "images", 
        wikidata = params.wikidata or {property = {"P158"}},
        imageparameters = params.imageparameters 
             or { "ختم", "seal"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat,
        captionparameter = params.captionparameter or
            { "تعليق ختم",  "seal_caption"},
        defaultupright = params.upright or upright or "0.8",
        uprightparameter = params.uprightparameter or { "upright seal"},
        sizeparameter = params.sizeparameter or { "seal_size"},
        numval = 1, 
        defaultcaption = 'الختم',
        metadata = {
			description = "صورة للختم (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_seal.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end
generic.sceau = generic.seal

generic.description["flag"] = "إضافة صورة العلم";
function generic.flag(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        suggested = true,
        wikidata = params.wikidata or {property = "P41"},
        imageparameters = params.imageparameters or {"العلم", "علم", "flag"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat,
        captionparameter = params.captionparameter or "تعليق العلم",
        defaultupright = params.upright or upright or "0.6",
        uprightparameter = params.uprightparameter or "upright drapeau",
        sizeparameter = params.sizeparameter or {"حجم العلم", "flag_size"},
        numval = 1,
        defaultcaption = 'العلم',
        metadata = {
			description = "صورة للعلم (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_flag.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

generic.description["sign"] = "إضافة صورة لافتة";
function generic.sign(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        wikidata = params.wikidata or {property = "P14"},
        imageparameters = params.imageparameters or {"لافتة"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat,
        captionparameter = params.captionparameter or "تعليق اللافتة",
        defaultupright = params.upright or upright or "0.4",
        uprightparameter = params.uprightparameter or "upright signalisation",
        sizeparameter = params.sizeparameter or "حجم اللافتة",
        numval = 1,
        metadata = {
			description = "صورة اللافتة (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

generic.description["icon"] = "إضافة صورة أيقونة";
function generic.icon(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        wikidata = params.wikidata or {property = "P2910"},
        imageparameters = params.imageparameters or {"أيقونة", "icon"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat,
        captionparameter = params.captionparameter or {"تعليق أيقونة"},
        defaultupright = params.upright or upright or "0.4",
        uprightparameter = params.uprightparameter or "upright icon",
        sizeparameter = params.sizeparameter or "icon_size",
        numval = 1,
        metadata = {
			description = "صورة الأيقونة (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_icon.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

generic.description["scheme"] = "إضافة صورة مخطط";
function generic.scheme(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        wikidata = params.wikidata or {property = "P5555"},
        imageparameters = params.imageparameters or {"مخطط", "scheme"},
        captionparameter = params.captionparameter or "تعليق المخطط",
        defaultupright = params.upright or upright,
        uprightparameter = params.uprightparameter or "upright scheme",
        sizeparameter = params.sizeparameter or "حجم المخطط",
        numval = 1,
        metadata = {
			description = "صورة المخطط (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_scheme.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

generic.description["planview"] = "إضافة صورة مسقط";
function generic.planview(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        wikidata = params.wikidata or {property = "P3311"},
        imageparameters = params.imageparameters or {"مسقط", "planview"},
        captionparameter = params.captionparameter or "تعليق المسقط",
        defaultupright = params.upright,
        uprightparameter = params.uprightparameter or "upright planview",
        sizeparameter = params.sizeparameter or "حجم المسقط",
        numval = 1,
        metadata = {
			description = "صورة المسقط (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_planview.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

generic.description["bathymetricmap"] = "إضافة صورة خريطة قياس الأعماق";
function generic.bathymetricmap(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        wikidata = params.wikidata or {property = "P207"},
        imageparameters = params.imageparameters or {"خريطة قياس الأعماق"},
        defaultimage = params.defaultimage,
        maintenancecat = params.maintenancecat,
        captionparameter = params.captionparameter or "تعليق خريطة قياس الأعماق",
        defaultupright = params.upright or upright or "1",
        uprightparameter = params.uprightparameter or "upright bathymetricmap",
        sizeparameter = params.sizeparameter or "حجم خريطة قياس الأعماق",
        numval = 1,
        metadata = {
			description = "صورة خريطة قياس الأعماق (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

-- روابط خارجية
generic.description["website"] = "إضافة موقع ويب";
function generic.website(params)
    if not params then
        params = {}
    end
    return {
        type = "mixed",
        suggested = true,
        label = params.label or "موقع الويب",
        plurallabel = params.plurallabel or "مواقع الويب",
        value = params.value or {"موقع ويب", "موقع_ويب", "موقع", "url", "website"},
        valueStyle = {["text-align"] = "left", ["direction"] = "ltr", ["font-size"] = "0.9em"},
        wikidata = {
            wikimod = "Wikidata.Ca",
            property = params.property or "P856",
            qualifier = "P407",
            whitelist1 = "Q13955", -- for arabic website
            qualifier2 = "P518", blacklist2 = "Q19778981", -- for  Tor onion service
            formatting = "table",
            conjunction = "<br />",
            rowformat = "$0$R0 $1",
            rowsubformat1 = '<small><span class="languageicon" style="font-size:0.75em; font-weight:bold; color:#555;">($1)</span></small>',
            colformat0 = "weblink",
            colformat1 = "label"
        },
        wikidata2 = {
            wikimod = "Wikidata.Ca",
            property = params.property or "P856",
            listrank = "bestrank",
            qualifier = "P407", -- for other languages website
            qualifier2 = "P518", blacklist2 = "Q19778981", -- for  Tor onion service
            formatting = "table",
            conjunction = "<br />",
            rowformat = "$0$R0 $1",
            rowsubformat1 = '<small><span class="languageicon" style="font-size:0.75em; font-weight:bold; color:#555;">($1)</span></small>',
            colformat0 = "weblink",
            colformat1 = "label"
        },
        metadata = {
			description = params.description or "فقط الموقع الرسمي على الويب (المواقع غير الرسمية تذكر في فقرة «وصلات خارجية»).",
			option = "suggested", 
			type = "url",
        }
    }
end

generic.description["blog"] = "إضافة موقع المدونة";
function generic.blog(params)
    if not params then
        params = {}
    end
	return generic.website({
		label = params.label or "[[مدونة|المدونة الرسمية]]", 
		value = params.value or {'مدونة','blog'}, 
		property = params.property or 'P1581',
		description = params.description or 'فقط المدونة الرسمية  (المواقع غير الرسمية تذكر في فقرة «وصلات خارجية»).'
	 })
end

-- أصوات
generic.description["selectSound"] = "إضافة صوت";
function generic.selectSound(params)
    if not params then
        params = {}
    end

    params.type = "images"

    params.style = params.style or {["padding-top"] = "25px"}
    params.defaultcaption = "الصوت"
    params.caption = params.captionparameter or "تعليق الصوت"
    params.value = params.valueparameter or {"صوت", "sound"}
    params.defaultsize = "280"
    params.numval = params.numval or 1

    params.wikidata = {
        wikimod = "Wikidata.Ca",
        property = params.property or "P51",
        qualifier = "P407",
        whitelist1 = "Q13955", -- for arabic
        formatting = "table",
        conjunction = "<br />",
        rowformat = "$0"
    }
    params.wikidata2 = {
        wikimod = "Wikidata.Ca",
        property = params.property or "P51",
        listrank = "bestrank",
        qualifier = "P407", -- for other languages
        formatting = "table",
        conjunction = "<br />",
        rowformat = "$0"
    }
    params.metadata = {
        description = "ملف صوتي (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
		example = "abc.ogg",
        option = "", 
        type = "wiki-file-name",
    }

    return params
end

generic.description["pronunciation"] = "إضافة ملف صوتي للتهجئة";
function generic.pronunciation(params)
    if not params then
        params = {}
    end

    params.property = "P443"

    params.defaultcaption = "التهجئة"
    params.captionparameter = params.captionparameter or "تعليق التهجئة"
    params.value = params.valueparameter or {"تهجئة", "pronunciation"}
    params.numval = 1

    return generic.selectSound(params)
end

generic.description["dimensions"] = "إضافةالأبعاد";
function generic.dimensions(default)
    local function getDimensions(args)
        local Dimensionsfunction = require("Module:Dimensions").main

        local noerr, data, nb
        noerr, data = pcall(Dimensionsfunction, args)
        if noerr then
            return data
        else
            addMaintenanceCat("مقالات بها أخطاء مصدرها وحدة بطاقة")
            mw.log("WD Query Error : " .. mw.dumpObject(data))
            return '<span class="error">' .. (data) .. "</span>"
        end
    end

    return {
        type = "mixed",
        label = "الأبعاد",
        value = function()
            return localdata["أبعاد"] or localdata["الأبعاد"] or localdata.dimensions or localdata.dim or
                (type(localdata.item) == "table" and type(localdata.item.id) == "string" and
                    getDimensions(
                        {
                            item = localdata.item.id,
                            diameter = localdata.diameter or localdata["قطر"],
                            height = localdata.height or localdata["ارتفاع"],
                            draft = localdata.draft or localdata["عمق تحت خط الماء"],
                            clearance = localdata.clearance or localdata["مسافة تحتية"],
                            width = localdata.width or localdata.beam or localdata["عرض"],
                            length = localdata.length or localdata["horizontal depth"] or localdata["طول"] or
                                localdata["عمق أفقي"],
                            span = localdata.span or localdata["بين الركائز"],
                            thickness = localdata.thickness or localdata["سمك"]
                        }
                    ))
        end,
        metadata = {
			description = "قيم الأبعاد (طول- عرض - عمق - قطر - ارتفاع - سمك ...) بوحدات القياس",
			option = "", 
			type = "",
        }
    }
end

generic.description["awards"] = "إضافة الجوائز";
function generic.awards(params)
    return {
        type = "row",
        label = "الجوائز",
        value = {"جوائز", "جائزة", "awards"},
        wikidata = {
            wikimod = "Wikidata.Ca",
            property = "P166",
            tablesort = "1",
            sorting = "-1",
            separator = "<br />",
            qualifier = "P585",
            qualifier2 = "P1686",
            qualifier3 = "P1027",
            qualifier4 = "P166/P2425",
            qualifier5 = "P1346",
            formatting = "table",
            rowformat = "* $4&nbsp;$0$R0 $1$2$3$5",
            rowsubformat1 = "<small>($1)</small>",
            rowsubformat2 = "<small><br />, عن عمل ''«$2»''</small>",
            rowsubformat3 = "<small><br />&nbsp;تمنحها  $3</small>",
            rowsubformat4 = "[[file:$4|30px|link=]]",
            rowsubformat5 = "<small><br />منحت لـ $5</small>"
        },
        metadata = {
			description = "الجوائز الملحوظة فقط والتي لا تمنح ألقاب.",
			option = "", 
			type = "string",
        }
    }
end

generic.description["motto"] = "إضافة الشعار النصي";
function generic.motto(param)
    return {
        type = "row",
        label = "الشعار النصي",
        value = {"شعار_نصي", "motto", "motto_text"},
        defaultvalue = getValue {param},
        wikidata = {
            wikimod = "Wikidata.Ca",
            property = "P1451",
            conjunction = "<br />",
            formatting = "$text {{Language icon|NoCat=y|$language}}"
        },
        metadata = {
			description = "شعار نصي (بالإنجليزية:motto) (وليس صورة)",
			option = "", 
			type = "string",
        }
    }
end

-- أدوات تحديد الموقع الجغرافي

generic.description["country"] = "إضافة البلد";
function generic.country(default)
    local building = require "وحدة:بطاقة/أدوات/مبنى"
    return building.country(default)
end

generic.description["geoloc"] = "إضافة خريطة الموقع التفاعلية";
function generic.geoloc(params)
    if not params then
        params = {}
    end

    if (localdata["خريطة الموقع"] == "-") then
        return nil
    end

    local params2 
    local id = (localdata.item and localdata.item.id)
    local geotype = "Point"
    if id and
        (#(mw.wikibase.getBestStatements(id, "P3896")) > 0 or 
        #(mw.wikibase.getBestStatements(id, "P402")) > 0) then
        geotype = "geoshape"
        params2 = {geotype2 = 'geoline', id2 = params.id, stroke2 = "#FF0000"}
    end

    return {
        type = "map",
        latitude = {"دائرة عرض", "دائرة العرض", "latitude"},
        longitude = {"خط طول", "خط الطول", "longitude"},
        pointtype = params.pointtype,
        maptype = params.type,
        globe = localdata.globe or localdata["كوكب"] or params.globe,
        marker = params.marker,
        markercolor = params.markercolor,
        shapecolor = params.shapecolor,
        markersize = params.markersize,
        markersymbol = params.markersymbol,
        default_zoom = localdata["zoom"] or localdata["تكبير"] or params.default_zoom,
        ids = params.ids ,
        id = params.id,
        geotype = params.geotype or geotype,
        params = params2,
        --debug = 1,
        metadata = {
			description = "",
			option = "", 
			type = "",
        }
    }
end

generic.description["coordinates"] = "إضافة الإحداثيات";
function generic.coordinates(params)
    if not params then
        params = {}
    end

    return {
        type = "mixed",
        label = "الإحداثيات",
        value = {"إحداثيات", "احداثيات", "coordinates"},
        wikidata = {
            wikimod = "Wikidata.Ca",
            listrank = "bestrank",
            property = "P625",
            formatting = "{{coord|$lat|$lon|globe:$globe|format=dms}}"
        },
        metadata = {
			description = "الإحداثيات الجغرافية",
			option = "", 
			type = "string",
        }
    }
end

generic.description["locationmap"] =  "إضافة خريطة الموقع";
function generic.locationmap(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        imageparameters = params.imageparameters or {"صورة خريطة"},
        sizeparameter = params.sizeparameter or "حجم صورة خريطة",
        captionparameter = params.captionparameter or {"تعليق صورة خريطة"},
        defaultupright = params.upright or "1",
        property = "P242",
        numval = 1,
        metadata = {
			description = "صورة خريطة جغرافية (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_map.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

generic.description["detailedmap"] =  "إضافة خريطة مفصلة";
function generic.detailedmap(params)
    if not params then
        params = {}
    end

    return {
        type = "images",
        imageparameters = params.imageparameters or {"صورة خريطة مفصلة"},
        sizeparameter = params.sizeparameter or "حجم صورة خريطة مفصلة",
        captionparameter = params.captionparameter or {"تعليق صورة خريطة مفصلة"},
        defaultupright = params.upright or "1",
        defaultsize = params.defaultsize,
        property = "P1621",
        numval = 1,
        metadata = {
			description = "صورة خريطة جغرافية مفصلة (ضع اسم الملف فقط دون السابقة «ملف:» أو «File:»)",
			example = "abc_map.jpg",
			option = "", 
			type = "wiki-file-name",
        }
    }
end

generic.description["replaces"] =  "حل محل";
function generic.replaces(params)
    if not params then
        params = {}
    end
    return {
        type = "row",
        label = "عوض",
        value = {"عوض","replaces"},
        wikidata= params.wikidata or {property = "P1398 OR P1365"}, 
        metadata = {
			description = "حل محل",
			option = "", 
			type = "", 
        }
    }
end

generic.description["replacedby"] =  "حل مكانه";
function generic.replacedby(params)
    if not params then
        params = {}
    end
    return {
        type = "row",
        label = "حل مكانه",
        value = {"حل مكانه","replaced_by"},
        wikidata = params.wikidata or {property = "P167 OR P1366"}, 
        metadata = {
			description = "عوضه",
			option = "", 
			type = "", 
        }
    }
end

generic.description["memberof"] =  "المنظمات والهيئات التي انتسب إليها."

function generic.memberof()
	return {type = 'multi', rows = {
		{
			type = 'row', 
			label = 'عضو في', 
			value = {'عضو','عضو في','عضوية','member of','membre de'}, 
			wikidata = {
				wikimod = 'Wikidata.Ca', formatting='table',
				property = 'P463', qualifier1='P2868' ,rowsubformat1=', $1',
				rowformat = '$0$R0$1',
				sorttype= 'chronological', showDate = 'true', 
				conjunction = '<br />'},
		},
		metadata = {
			description = "المنظمات والهيئات التي انتسب إليها.",
			option = "", 
			type = "",
		}
	}}
end

return generic