#!/usr/bin/perl

# NOTE: this script is used by generate-new-scores; it is meant to be copied
#       to and called from the masses/ directory of the checkout being used
#       for the score generation run for the particular scoreset; you
#       shouldn't need to call this script manually
#
# locks the score ranges for the base release rules to their original scores
# from 50_scores.cf
#
# the script also uses existing scores in 72_active.cf (even commented ones)
# to set the absolute min or max score in the ranges.data file
#
# if called with a 1 parameter new rules that aren't in the most current copy
# of the active.list file will be locked to zero so that the GA can ignore
# rules that aren't in the most current update (this is used for zeroing rules
# found in the weekly net checks that are no longer in the nightly non-net
# checks which 6 of 7 updates a week are based on)
#
# <@LICENSE>
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# </@LICENSE>

use strict;
use warnings;

my $scoreset = 0; # default

my %rulescores;
my %newrulescores;
my %currently_active;

my $only_currently_active_rules = (defined $ARGV[0] && $ARGV[0] == 1 ? 1 : 0);

open(CONFIG, "config") or die "Cannot open config file: $!";
while (<CONFIG>) {
  /^\s*SCORESET=(\d)\s*$/;
  $scoreset = $1;
  # don't exit loop in case scoreset appears in config again
}
close CONFIG;

print "Fixing score range for existing rules to current scoreset $scoreset score\n";

open(ORIG, "../rules/50_scores.cf") or die "Cannot open original score file: $!";
while(<ORIG>) {
  if (/^score/) {
    /^score\s+(\S+)\s+(-?[\d.]+)(?:\s+(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+))?/;
    my @scores;
    if (defined $3) {
      push @scores, ($2, $3, $4, $5);
    } else {
      push @scores, ($2, $2, $2, $2);
    }
    $rulescores{$1} = $scores[$scoreset];
  }
}
close ORIG;

open(ORIG, "../rules/72_active.cf") or die "Cannot open original score file: $!";
while(<ORIG>) {
  if (/^(?:\#\s*)?score/) {
    /^(?:\#\s*)?score\s+(\S+)\s+(-?[\d.]+)(?:\s+(-?[\d.]+)\s+(-?[\d.]+)\s+(-?[\d.]+))?/;
    my @scores;
    if (defined $3) {
      push @scores, ($2, $3, $4, $5);
    } else {
      push @scores, ($2, $2, $2, $2);
    }
    $newrulescores{$1} = $scores[$scoreset];
  }
}
close ORIG;

if ($only_currently_active_rules) {
  open(ACTIVE, "../rules-current/active.list") or die "Cannot open rules-current/active.list: $!";
  while(<ACTIVE>) {
    $currently_active{$1} = undef if (/^(?!#)(\S+)$/);
  }
  close ACTIVE;
}

open(ORIG, "tmp/ranges.data") or die "Cannot open original range.data file: $!";
open(NEW, ">tmp/ranges.data-new") or die "Cannot open range.data-new file: $!";
while (<ORIG>) {
#  if (/^(?:(?:-?[\d.]+) ){3}(\S+)$/) {
  if (/^(-?[\d.]+) (-?[\d.]+) (-?[\d.]+) (\S+)$/) {
    if (defined $rulescores{$4}) {
      print NEW "$rulescores{$4} $rulescores{$4} 0 $4\n";
    } else {
      if ($only_currently_active_rules) {
        if (exists $currently_active{$4}) {
          if (defined $newrulescores{$4}) {
            if ($newrulescores{$4} > 0) {
              print NEW "0 $newrulescores{$4} $3 $4\n"
            } else {
              print NEW "$newrulescores{$4} 0 $3 $4\n"
            }
          } else {
            print NEW $_;
          }
        } else {
          print NEW "0 0 0 $4\n";
        }
      } else {
        print NEW $_;
      }
    }
  } else {
    print NEW $_;
  }
}
close ORIG;
close NEW;
