#!/bin/bash

filename=${1:-input.txt}
exec 3<"${filename}"

read -u 3 line

start_password=${line%-*}
end_password=${line#*-}

check_valid_1() {
    cur_password=$1
    last_val=${cur_password:0:1}
    got_dupe=0
    if [ $cur_password -ge $start_password ] && [ $cur_password -le $end_password ]; then
        for (( a=1; a<${#cur_password}; a++ )); do
            val=${cur_password:$a:1}
            if [ $val -ge $last_val ]; then
                if [ $val -eq $last_val ]; then
                    got_dupe=1
                fi
            else
                return 1
            fi
            last_val=$val
        done
        if [ $got_dupe -eq 1 ]; then
            return 0
        fi
    else
        return 1
    fi

    return 1
}

check_valid_2() {
    cur_password=$1
    last_val=${cur_password:0:1}
    val=$last_val
    dupe_count=1
    got_dupe=0
    if [ $cur_password -ge $start_password ] && [ $cur_password -le $end_password ]; then
        for (( a=1; a<${#cur_password}; a++ )); do
            val=${cur_password:$a:1}
            if [ $val -ge $last_val ]; then
                if [ $val -eq $last_val ]; then
                    dupe_count=$((dupe_count+1))
                else
                    # only pairs
                    if [ $dupe_count -eq 2 ]; then
                        got_dupe=1
                    fi
                    dupe_count=1
                fi
            else
                return 1
            fi
            last_val=$val
        done
        if [ $dupe_count -eq 2 ]; then
            got_dupe=1
        fi
        if [ $got_dupe -eq 1 ]; then
            return 0
        else
            return 1
        fi
    else
        return 1
    fi

    return 1
}

get_next() {
    password=$1
    temp_password=$((password+1))
    last_val=${temp_password:0:1}
    new_password="$last_val"
    for (( a=1; a<${#temp_password}; a++ )); do
        val=${temp_password:$a:1}
        if [ $val -lt $last_val ]; then
            val=$last_val
            for (( b=$a; b<${#temp_password}; b++ )); do
                new_password+=$val
            done
            echo "$new_password"
            return 0
        fi
        new_password+=$val
        last_val=$val
    done

    echo "$new_password"
}

cur_password=$start_password
valid_passwords=0
valid_passwords_2=0
while [ $cur_password -le $end_password ]; do
    #echo -n "$cur_password: "
    if ( check_valid_1 $cur_password ); then
        #echo -n valid
        valid_passwords=$((valid_passwords+1))
        if ( check_valid_2 $cur_password ); then
            #echo " valid"
            valid_passwords_2=$((valid_passwords_2+1))
        else
            #echo " invalid"
            true
        fi
    else
        #echo invalid
        true
    fi
    cur_password=$(get_next $cur_password)
done

echo "There are $valid_passwords valid passwords"
echo "And $valid_passwords_2 really valid passwords"
