Price Per battle

Show Price per battle in market. If you encounter problem, contact me https://www.lordswm.com/pl_info.php?id=6997830

// ==UserScript==
// @name         Price Per battle
// @namespace    https://www.lordswm.com
// @version      0.8
// @description  Show Price per battle in market. If you encounter problem, contact me https://www.lordswm.com/pl_info.php?id=6997830
// @author       You
// @match        https://www.lordswm.com/auction.php*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const localStorageKey = "repairCostArtifacts";
    const localStorageRcKey = "repairCostRepairCost";
    const localStorageEfficiencyKey = "repairCostRepairEfficiency";
    const storage = window.localStorage;
    let existKey = storage.getItem(localStorageKey);
    let artToSaveCost;
    if(existKey === null){
        storage.setItem(localStorageKey,"{}")
    }
    existKey = storage.getItem(localStorageRcKey);
    if(existKey === null){
        storage.setItem(localStorageRcKey,101)
    }
    existKey = storage.getItem(localStorageEfficiencyKey);
    if(existKey === null){
        storage.setItem(localStorageEfficiencyKey,90)
    }

    document.querySelectorAll("tr.wb").forEach(x=>{
        try{
            let s = x.innerText;
            let index = s.search("Durability: ")+"Durability: ".length;
            let dur = parseInt(s.substr(index));
            let maxDur = parseInt(s.substr(index).split("/")[1])
            let splited = s.split('\n');
            /*index = 4;
            if (splited.indexOf("Buyout price:")!=-1){
                index=6;
            }
            if (splited.indexOf("	Buy now!	")!=-1){
                index=splited.indexOf("	Buy now!	")+1;
            }
*/

            let price = parseInt(x.children[2].innerText.replaceAll(',',''))
            if(isNaN(price/dur))
            {
                return;
            }
            //console.log(price/dur);
            let ele = document.createElement('p');
            ele.id = "ppb";
            ele.price = price;
            ele.dur = dur;
            ele.maxDur = maxDur;
            ele.innerText = "Price per battle = "+(price/dur).toFixed(2);
            ele.fatherWow = x;
            ele.cpb = (price/dur);
            x.children[0].appendChild(ele)
        }
        catch(err)
        {
            console.log(err);
        }
    })

    let url = new URL(document.URL);
    let artType = url.searchParams.get("art_type");
    if (artType !== null)
    {
        console.log("its art market, run prices")

        let selling = document.querySelector("td.wbwhite");
        let div = document.createElement("div");

        let i = document.createElement("input");
        //i.setAttribute("placeholder", "");
        let label = document.createElement("label");
        label.for = "repairCost";
        label.innerText = "Repair Cost  "
        i.id = "repairCost";
        i.size = "5"
        //i.value = 16000;
        let rc = getArtPrice(artType)
        if(rc!==undefined)
        {
            i.value = rc;

        }
        //this indicate we need to save repair cost when clicked on calc
        artToSaveCost = artType;

        div.appendChild(label)
        div.appendChild(i)


        i = document.createElement("input");
        i.id = "repairEfficiency";
        //i.setAttribute("placeholder", "Repair efficiency");
        i.value = storage.getItem(localStorageEfficiencyKey);
        i.size = "5"
        label = document.createElement("label");
        label.for = "repairEfficiency";
        label.innerText = "  Repair Efficiency %  "
        div.appendChild(label)
        div.appendChild(i)


        i = document.createElement("input");
        i.id = "bsRepairCost";
        //i.setAttribute("placeholder", "Repair cost");
        i.value = storage.getItem(localStorageRcKey);
        i.size = "5"
        label = document.createElement("label");
        label.for = "bsRepairCost";
        label.innerText = "  Smith cost %  "

        div.appendChild(label)
        div.appendChild(i)

        i = document.createElement("button");
        i.innerText = "Calculate with repairing";
        i.onclick=calcPriceAllArts;
        div.appendChild(i)
        selling.prepend(div)
        if(rc!==undefined){
            i.click();
        }
    }

    function sortByCpb(){
        Array.from(document.querySelectorAll("p#ppb")).sort((a,b)=>a.cpb<b.cpb?-1:1).forEach(x=>x.fatherWow.parentElement.appendChild(x.fatherWow));
    }

    function calcPriceAllArts()
    {
        let repairCost = parseInt(document.querySelector("input#repairCost").value);
        setArtPrice(artToSaveCost,repairCost);

        let repairEfficiency = parseInt(document.querySelector("input#repairEfficiency").value);
        storage.setItem(localStorageEfficiencyKey,repairEfficiency);

        let bsRepairCost = parseInt(document.querySelector("input#bsRepairCost").value);
        storage.setItem(localStorageRcKey,bsRepairCost);

        document.querySelectorAll("p#ppb").forEach(x=>{
            let calculated = calcPrice(x.dur,x.maxDur,x.price,repairCost,repairEfficiency,bsRepairCost);
            x.innerText=`Lowest PPB: ${calculated.cpb.toFixed(2)} after ${calculated.numberOfRepairs} repairs`
            x.cpb = calculated.cpb;

        })
        sortByCpb();
    }

    function calcPrice(dur,maxDur,auctionCost,artRepairCost,repairEfficiency,bsRepairCost){
        //calcPrice(60,70,16000,15555,90,101)example
        let maxDuration = maxDur;
        let cpb;
        let numberOfRepairs = -1;
        let totalDuration = dur;
        let totalCost = auctionCost;
        let previousCPB;
        let actualCPB;
        do{

            previousCPB= totalCost/totalDuration;
            numberOfRepairs++;
            cpb = previousCPB;
            totalDuration += Math.floor(maxDuration*repairEfficiency/100);
            totalCost += artRepairCost*bsRepairCost/100;
            maxDuration -= 1;
            console.log(maxDuration,totalDuration,totalCost);
            actualCPB = totalCost/totalDuration;
        }
        while(actualCPB<previousCPB);
        console.log(cpb,numberOfRepairs);
        return {cpb:cpb,numberOfRepairs:numberOfRepairs};
    }
    window.calcPrice = calcPrice;


    function getArtPrice(artName){
        let stringArts = storage.getItem(localStorageKey);
        let arts = JSON.parse(stringArts);
        return arts[artName];
    }

    function setArtPrice(artName, artPrice) {
        let stringArts = storage.getItem(localStorageKey);
        let arts = JSON.parse(stringArts);
        arts[artName] = artPrice;
        storage.setItem(localStorageKey,JSON.stringify(arts))
    }

})();