#!/bin/bash

set -u
set -o pipefail

if [[ $# -ne 2 ]]; then
    echo "Usage: $0 before.json after.json"
    exit 1
fi

before_file="$1"
after_file="$2"

if [[ ! -f "$before_file" ]]; then
    echo "Missing file: $before_file"
    exit 1
fi

if [[ ! -f "$after_file" ]]; then
    echo "Missing file: $after_file"
    exit 1
fi

if ! command -v jq >/dev/null 2>&1; then
    echo "jq is required but not installed."
    exit 1
fi

domains=$(
    {
        jq -r '.[].domain' "$before_file"
        jq -r '.[].domain' "$after_file"
    } | sort -u
)

printf "%-35s %-8s %s\n" "DOMAIN" "RESULT" "DETAILS"
printf "%-35s %-8s %s\n" "-----------------------------------" "--------" "----------------------------------------"

while IFS= read -r domain; do
    [[ -z "$domain" ]] && continue

    before_exists=$(jq -r --arg d "$domain" 'map(select(.domain == $d)) | length' "$before_file")
    after_exists=$(jq -r --arg d "$domain" 'map(select(.domain == $d)) | length' "$after_file")

    if [[ "$before_exists" -eq 0 ]]; then
        printf "%-35s %-8s %s\n" "$domain" "WARN" "missing in before file"
        continue
    fi

    if [[ "$after_exists" -eq 0 ]]; then
        printf "%-35s %-8s %s\n" "$domain" "FAIL" "missing in after file"
        continue
    fi

    before_status=$(jq -r --arg d "$domain" 'map(select(.domain == $d))[0].status' "$before_file")
    before_final_url=$(jq -r --arg d "$domain" 'map(select(.domain == $d))[0].final_url' "$before_file")
    before_title=$(jq -r --arg d "$domain" 'map(select(.domain == $d))[0].title' "$before_file")

    after_status=$(jq -r --arg d "$domain" 'map(select(.domain == $d))[0].status' "$after_file")
    after_final_url=$(jq -r --arg d "$domain" 'map(select(.domain == $d))[0].final_url' "$after_file")
    after_title=$(jq -r --arg d "$domain" 'map(select(.domain == $d))[0].title' "$after_file")

    result="PASS"
    details=()

    if [[ "$before_status" != "$after_status" ]]; then
        result="FAIL"
        details+=("status: ${before_status} -> ${after_status}")
    fi

    if [[ "$before_final_url" != "$after_final_url" ]]; then
        if [[ "$result" != "FAIL" ]]; then
            result="WARN"
        fi
        details+=("final_url changed")
    fi

    if [[ "$before_title" != "$after_title" ]]; then
        if [[ "$result" != "FAIL" ]]; then
            result="WARN"
        fi
        details+=("title changed")
    fi

    if [[ ${#details[@]} -eq 0 ]]; then
        details=("no changes")
    fi

    printf "%-35s %-8s %s\n" "$domain" "$result" "$(IFS='; '; echo "${details[*]}")"

done <<< "$domains"
