# score_calc.py

def calc_score(impressions, reach, frequency, clicks, link_clicks, lpv,
               ctr, cpm, cpc, cpl, budget_eur, amount_spent, leads, target_cpl):
    """
    Calculates a performance score exactly like the inline version.
    Returns a numeric score (float).
    """

    # safe numeric conversion
    def nf(x):
        try:
            return float(x or 0)
        except:
            return 0.0

    impressions = nf(impressions)
    reach = nf(reach)
    frequency = nf(frequency)
    clicks = nf(clicks)
    link_clicks = nf(link_clicks)
    lpv = nf(lpv)
    ctr = nf(ctr)
    cpm = nf(cpm)
    cpc = nf(cpc)
    cpl = nf(cpl)
    budget_eur = nf(budget_eur)
    amount_spent = nf(amount_spent)
    leads = nf(leads)
    target_cpl = nf(target_cpl)

    score = 0

    # --- score calculation ---
    if impressions > 10000:
        score += 1
    elif impressions < 10000 and impressions > 1000:
        score += 0.5
    else:
        score += 0.1

    if reach > 5000:
        score += 1
    elif reach < 5000 and reach > 500:
        score += 0.5
    else:
        score += 0.1

    if frequency > 3:
        score += 0.1
    elif frequency < 3 and frequency > 1.5:
        score += 0.5
    else:
        score += 1

    if clicks > 200:
        score += 1
    elif clicks < 200 and clicks > 50:
        score += 0.5
    else:
        score += 0.1

    if link_clicks > 150:
        score += 1
    elif link_clicks < 150 and link_clicks > 30:
        score += 0.5
    else:
        score += 0.1

    if lpv > 10:
        score += 1
    elif lpv < 10 and lpv > 3:
        score += 0.5
    else:
        score += 0.1

    if ctr > 1.0:
        score += 1
    elif ctr < 1.0 and ctr > 0.7:
        score += 0.5
    else:
        score += 0.1

    if cpm > 70:
        score += 0.1
    elif cpm < 70.0 and cpm > 40.0:
        score += 0.5
    else:
        score += 1

    if cpc > 5:
        score += 0.1
    elif cpc < 5.0 and cpc > 3.0:
        score += 0.5
    else:
        score += 1

    if cpl > target_cpl * 1.5:
        score += 0.5
    elif cpl < target_cpl * 1.5 and cpl > target_cpl * 1.1:
        score += 2
    else:
        score += 4

    # protection for division by zero
    if leads and float(leads) != 0:
        ratio = amount_spent / leads
    else:
        ratio = 999999

    if ratio < 90:
        score += 2
    elif ratio > 90 and ratio < 150:
        score += 1
    else:
        score += 0.1

    return round(score, 2)
