"""One solution. Try the exercise first."""
import random


def corpus_wer(errors: list[int], words: list[int]) -> float:
    return sum(errors) / sum(words)


def percentile(sorted_values: list[float], q: float) -> float:
    return sorted_values[min(len(sorted_values) - 1, int(q * len(sorted_values)))]


def bootstrap_ci(errors, words, n_boot=1000, seed=0):
    rng = random.Random(seed)
    n = len(errors)
    samples = []
    for _ in range(n_boot):
        idx = [rng.randrange(n) for _ in range(n)]
        samples.append(sum(errors[i] for i in idx) / sum(words[i] for i in idx))
    samples.sort()
    return percentile(samples, 0.025), percentile(samples, 0.975)


def paired_bootstrap(errors_a, errors_b, words, n_boot=1000, seed=0):
    rng = random.Random(seed)
    n = len(words)
    diffs = []
    for _ in range(n_boot):
        idx = [rng.randrange(n) for _ in range(n)]      # the same clips for both models
        w = sum(words[i] for i in idx)
        diffs.append((sum(errors_b[i] for i in idx) - sum(errors_a[i] for i in idx)) / w)
    diffs.sort()
    return percentile(diffs, 0.025), percentile(diffs, 0.975)


def verdict(lo: float, hi: float) -> str:
    if hi < 0:
        return "better"
    if lo > 0:
        return "worse"
    return "can't tell"
