# retoor <retoor@molodetz.nl>
import argparse
import json


class ProviderStats:
    def __init__(self):
        self.successes = 0
        self.failures = 0
        self.total_time = 0.0

    @property
    def attempts(self):
        return self.successes + self.failures

    @property
    def success_rate(self):
        if self.attempts == 0:
            return 0.5
        return self.successes / self.attempts

    @property
    def avg_time(self):
        if self.successes == 0:
            return 10.0
        return self.total_time / self.successes

    @property
    def score(self):
        if self.attempts < 3:
            return 0.5
        speed_factor = max(0.0, 1.0 - (self.avg_time / 20.0))
        return self.success_rate * 0.7 + speed_factor * 0.3

    def record_success(self, elapsed):
        self.successes += 1
        self.total_time += elapsed

    def record_failure(self):
        self.failures += 1


def order(providers, stats):
    return sorted(providers, key=lambda name: stats[name].score, reverse=True)


def from_json(payload):
    stats = {}
    for name, row in payload.items():
        entry = ProviderStats()
        entry.successes = int(row.get("successes", 0))
        entry.failures = int(row.get("failures", 0))
        entry.total_time = float(row.get("total_time", 0.0))
        stats[name] = entry
    return stats


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Order search providers by adaptive score.")
    parser.add_argument("stats", help="JSON file mapping provider names to successes, failures, total_time")
    args = parser.parse_args()
    with open(args.stats, encoding="utf-8") as handle:
        loaded = from_json(json.load(handle))
    ranked = order(list(loaded), loaded)
    print(json.dumps({"order": ranked, "scores": {name: round(loaded[name].score, 4) for name in ranked}}))
