# $NetBSD: nanpa.awk,v 1.3 2023/01/28 13:12:16 jmcneill Exp $
#
# todo:
#       parse "https://nationalnanpa.com/nanp1/npa_report.csv"
#           instead of scraping HTML.
#
function trim(s)
{
       gsub(/^[ \t]+|[ \t]+$/, "", s);
       return s;
}
function mapinit(postdb)
{
       while ((getline < postdb) > 0) {
               sub(/#.*/, "");
               if (length($0)==0) continue;
               NF=split($0, f);
               location[f[1]] = f[2];
               flocation[tolower(f[2])] = f[2];
               country[f[1]] = f[4];
               fcountry[tolower(f[2])] = f[4];
       }
}
function countrymap(s)
{
       if (s == "CA") return "Canada";
       if (s == "US") return "USA";
       return s;
}
function locationmap(s, t)
{
       if (s in location) {
               t = location[s];
               if (s in country) {
                       t = t " (" countrymap(country[s]) ")";
               }
       } else if (tolower(s) in flocation) {
               t = flocation[tolower(s)];
               if (tolower(s) in fcountry) {
                       t = t " (" countrymap(fcountry[tolower(s)]) ")";
               }
       } else {
               t = s;
       }
       return t;
}
function parse(file, ispipe, isplanning,        i, planinit, t)
{
       planinit = 0;
       while((ispipe?(file | getline):(getline < file)) > 0) {
               sub(/#.*/, "");
               if (length($0)==0) continue;
               if (isplanning) {
                       NF=split($0, f);
                       if (!planinit && f[2]=="New NPA") {
                               planinit=1;
                               for (i=1; i<=NF; i++)
                                       fnames[f[i]]=i-1;
                       } else if (planinit && length(f[fnames["New NPA"]])>1) {
                               t = locationmap(trim(f[fnames["Location"]])) FS;
                               if (trim(f[fnames["Overlay?"]])=="Yes")
                                 t = t "Overlay of " trim(f[fnames["Old NPA"]]);
                               else if (f[fnames["Old NPA"]])
                                 t = t "Split of " trim(f[fnames["Old NPA"]]);
                               if (f[fnames["Status"]])
                                       t = t " (" trim(f[fnames["Status"]]) ")";
                               if (length(f[fnames["In Service Date"]]) > 1)
                                       t = t " effective " \
                                           trim(f[fnames["In Service Date"]]);
                               data[trim(f[fnames["New NPA"]]) "*"] = t;
                       }
               } else {
                       # digits only
                       match($0, /^[0-9]/);
                       if (RSTART==0) continue;
                       i=index($0, FS);
                       data[substr($0, 1, i-1)]=locationmap(trim(substr($0,i+1)));
               }
       }
       close(file);
}

BEGIN{
       FS=":"
       mapinit("na.postal");
       print "# $""NetBSD: $";
       print "# Generated from https://nationalnanpa.com/area_codes/index.html";
       print "# (with local exceptions)";
       print "# ";
       print "# format:";
       print "#   Area Code : Description : Detail : State/Province Abbrev.";
       print "#   (3rd and 4th fields optional)";
       print "#   A * in the Area Code field indicates a future area code."
       print "# ";
       parse("ftp -o - " \
           "https://nationalnanpa.com/enas/geoAreaCodeNumberReport.do" \
           " | sed -f nanpa.sed", 1, 0);
       parse("ftp -o - " \
           "https://nationalnanpa.com/enas/nonGeoNpaServiceReport.do" \
           " | sed -f nanpa.sed", 1, 0);
       parse("ftp -o - " \
           "https://nationalnanpa.com/enas/plannedNpasNotInServiceReport.do" \
           " | sed -f nanpa.sed", 1, 1);
       parse("na.phone.add", 0, 0);
       sort="sort -n";
       for (i in data)
               print i FS data[i] | sort
       close(sort);
}