#!/usr/bin/env perl

use strict;
use warnings;

use utf8;
use v5.18;
use open qw(:std :utf8);
use Term::ANSIColor;

my $word_mispell = qr{
    shaedra
    |[mM]urri|murry
    |[aA]ryes|aryès
    |[aA]leria|aléria
    |[dD]jaira|djaïra
    |[kK]ahiso|kahisso
    |[dK]ravkian
    |[rR]evis|révis
    |[sS]atme|[jJ]ans
    |[aA]kín|akyn|[aA]kin
    |Emariz|Hareldin|Brínsals|Daian
    |laygra|déria|dolgy|Dolgi|dolgi
    |lénissu|[lL]énisu
    |Awmeth|Revis
    |Deria|déria
    |Wigy|wigy|wiguy
    |Jaixel|jaixel|jaïxel
    |Marevor|marevor
    |Drenau
    |Mirleria
    |Mireglia
    |Domerath
    |Tebayama
    |Trevan
    |Hélith
    |Néldaru
    |Zaix
    |Skoyena
    |Leéresia
    |Léerésia
    |Léérésia

    |soredrip
    |faïngale
    |Sreda|sreda
    |tiyane|ternianne|saijit|cekals|jaipu|nailtais
    |faingal|say-guetran|magare|yedray|Yedray
    |ajensoldrais
    |guarate
    |belarque
    |apatique|apatisme
    |essentiatique
    |orilhes
    |Neyram
    |Bélyac
    |Voile
    |conclua|concluai
#    |feins|feint
#    |joint|rejoint
#    |déduit|déduis
#    |convainc|vaincut
#    |j'éteins|j'atteins
#    |éteint
    |asseyâmes
    |cuit|cuis
    |construit|construis|construirent
#    |détruit|détruis
#    |enduis|enduit
#    |instruit|instruis
#    |introduit|introduis
#    |produit|produis
#    |réduis|réduit
#    |séduit|séduis
#    |traduit|traduis
    |suppliquait|suppliquai|suppliqua|suppliqué
    |résout
    |fuyèrent|enfuyèrent|s'enfuyèrent|s'enfuyâmes|s'enfuya|s'enfuyai
    |détint|détenir
    
    |Jabalina|Drusio|Garra|Ventisque|ventisque|Muérdago
    |jabalina|drusio|garra|lubas|ventisque|muérdago
    |javelot|druse|blizzard|guiblanc

    |Tablonas|Riachuelos|Gorgona
    |Ciervo|Musarro|Amargura
    |Espina|Osuna
    |Coralo|Saniava|Puertos
    }x;
        
#        | \s\w+ais-je[\s\.,;]
#        | \w+ais?[\s\.,;]
#        | \s[tT]andis\s+qu
#        | \s[Aa]lors\s+qu
#        | \s[Pp]endant\s+qu
#        | \s[Qq]uand
#        | \s[Ll]orsqu
#        | au\s+cas\s+où

my $error = qr/
	  oe
        | :—
        | ¡
        | ¿
	| \salors\s+s'enfuir
	| \s[bB]ien\s+sûre[\s\.,]
	| \sy\s+se\s+demander 
	| \straquilité[\s\.,]
	| \smal\s+[\w']+er[\s\.,]
	| \savoir\s+[\w']+er[\s\.,]
	| \sêtre\s+[\w']+er[\s\.,]
	| \sdans\s+l'aire
	|observait\s+[\w']+er[\s\.,]
	|observai\s+[\w']+er[\s\.,]
	|observa\s+[\w']+er[\s\.,]
	|observèrent\s+[\w']+er[\s\.,]
	|observe\s+[\w']+er[\s\.,]
	| \sarranchant[\s\.]
	| \snerus[\s\.]
	| je\s+n'ai\s+pa\s+
	|\.\n\.Em\s+[,\.]
	| \selle\s+rendit\s+compte
	| \sils\s+n'y\s+aurait
	| cette\s+endroit
	| jaipu
	| \sno[\s\.]
	| de\s+accélérer
	| Celle\s+idée
	| Kirlen[\s\.]
	| acquiésça
	| quoiqu'en
	| [cC]e\s+peut-il
	| [cC]e\s+pourrait-il
	| [cC]e\s+pouvait-il
        | au\s+dehors
        | va-t-en
        | Va-t-en
        | par\s+dessus
        | c'est\s+à\s+dire
        | \selles\s+même
        | \seux\s+même
        | \slui\s+même
        | \selle\s+même
	| apparamment
	| l'autre\s+devaient 
	| \srein[\s\.,;]
	| \sque\s+il
	| \sque\s+elle
	| pairas
        | jour\slà
	| esseciatique
	| deux\s+maint[\s\.,;]
	| suffisammm+ent
	| de\s+vois
	| tranquilement
	| plutôt\s+que\s+prévu
	| n'a\s+pas\s+pus
	| possedait
	| herbre 
	| on\s+voie
	| energie
	| santé\s+mental[\s\.,;]
	| \suen[\s\.,;]
	| '\s
	| \sleus[\s\.,;]
	| \stres[\s\.,;]
	| \scelmites[\s\.,;]
	| \sn'auras\s+pas\s+[\w']+er[\s\.,;]
	| \sauras\s+[\w']+er[\s\.,;]
	| \smaintenaint
	| \sluix
	| \sdéfender
	| \strolles
	| \snécromantien
	| \scertains\s+\w\w\w+e[\s\.,;]
	| \son\s+ait\s+capable
	| \sIl\s+existaient
	| \sbonne\s+enfant
	| \sscéptique
	| \sce\s+que\s+sait\s+que
	| \sapprender
	| \scomprender

	| \s$word_mispell [\s\.,;]
        | \.\pL+
        | \sen\s+\w+an\s
	| \s(?:\w+-)?elle\s+[\w']+aient[\s\.,;]
	| \s(?:\w+-)?il\s+(?:[\w']+\s)?\s*\w+aient[\s\.,;]
	| \s(?:\w+-)?on\s+(?:[\w']+\s)?\s*\w+aient[\s\.,;]
	| \s(?:\w+-)?il\s+s'\w+er[\s\.,;]
	| \s(?:\w+-)?on\s+s'\w+er[\s\.,;]
	| \selle\s+s'\w+er[\s\.,;]
	| \sla\s+jour[\s\.,;]
	| \s(?:\w+-)?il\s+\w\w\w*[^m]ent[\s\.,;]
	| \s(?:\w+-)?on\s+\w\w\w*[^m]ent[\s\.,;]
	| \s(?:\w+-)?elle\s+\w\w\w*[^m]ent[\s\.,;]
        | \sl'une?\s+d'\w+\s+\w+aient
        | \s(?:souffr|fin)irai\s
	| \s[Jj](?:e\s+|')[\w']\w\w+a[\s\.,;]
	| \s[Jj](?:e\s+|')(?:me\s)?[\w+]t[\s\.,;]
	| [\w-]+être\s+\w\w\w+er[\s\.,;]

    /xs;

my $false_positive = qr{
  être\s*(?:super|fier)
  | (?:\s|^)[Mm]ais[\s\.,;]
  | [jJ]amais[\s\.,;]
}xsm;

my $text;
if (@ARGV == 0) {
    local $/;
    $text = <>;
    $text = do_preprocessing($text);
    search_errors($text);
} else {
    foreach (@ARGV) {
        open(my $fh, '<', $_) or die $!;
        local $/;
        $text = <$fh>;
        close $fh;
        print "Processing file $_...\n";
        $text = do_preprocessing($text);
        search_errors($text);
    }
}

exit 0;

sub search_errors {
    my $text = shift;
    while ($text =~ /([^\.]+)($error)([^\.]*\.)/xg) {
        my ($before, $error, $after) = ($1, $2, $3);
        next if "$before$error$after" =~ /$false_positive/;
        print
         colored("«", 'yellow'),
         $before,
         colored("$error", "red"),
         $after,
         colored("»", 'yellow'),
         "\n"
         if $error;
        next;
    }
}

sub do_preprocessing {
    my $text = shift;
    $text =~ s/\\".*//g;
    $text =~ s/"//g;
    $text =~ s/^\.\s*(?:Im|If|Lk|Tc|X|#).*//gm;
    $text =~ s/^\.\s*\S+\s*//gm;
    $text =~ s/\s*-ns\s*//g;
    $text =~ s/\h*-t\s+\S+\h*//g;
    $text =~ s/(?:-nonum|-f)//g;
    return $text;
}

