from incognito_anonymizer import Anonymizer
from incognito_anonymizer import analyzer
from incognito_anonymizer import mask
from incognito_anonymizer import PersonalInfo
from datetime import datetime
import pytest

dataset_regex = {
    "phone": ("tél: 0651565600", "tél: <NUMBER>"),
    "phone2": ("tél: 06 51 56 56 00", "tél: <NUMBER>"),
    "email": ("email : joe.lafripouille@chu-brest.fr", "email : <EMAIL>"),
    "email_2": ("email : Joe.LaFripouille@chu-brest.fr", "email : <EMAIL>"),
    "email_3": ("bob@gmail.com", "<EMAIL>"),
    "email_4": ("Joe.LaFripouille@chu-****.fr", "<EMAIL>"),
    "nir": ("nir : 164064308898823", "nir : <NUMBER>"),
    "nir_space": ("nir : 1 64 06 43 088 988 (23)", "nir : <NUMBER> (23)"),
    "NOM_Prenom": ("name : DUPONT Jean", "name : DUPONT Jean"),
    "Prenom_NOM": ("name : Jean DUPONT", "name : Jean DUPONT"),
    "Nom_compose_Prenom": ("name : De La Fontaine Jean", "name : De La Fontaine Jean"),
    "NOM-NOM_Prenom": ("name : DE-TROIS Jean", "name : DE-TROIS Jean"),
    "NOM_accent_Prénom": ("Monsieur JOÉÇ KAKŸÇ", "Monsieur <NAME>"),
    "NOM_accent_prénom": ("Monsieur JOÉÇ Poçèé", "Monsieur <NAME>"),
    "P._NOM": ("J. Jean", "J. Jean"),
    "Monsieur_NOM_Prenom": ("Monsieur KEAN Jean", "Monsieur <NAME>"),
    "Monsieur_NOM_Prenom_DOUBLE": (
        "Monsieur KEAN KEZAN Jean-Baptiste",
        "Monsieur <NAME>",
    ),
    "INTERNE_NOM-NOM_Prenom": (
        "name : Interne : DE-TROIS Jean",
        "name : Interne : <NAME>",
    ),
    "Titre_Interne": ("Interne", "Interne"),
    "Prenom_:_Prenom": ("Prenom : Georgette", "Prenom : <NAME>"),
    "Docteur_NOM_Prenom": ("Docteur DUPONT Jean", "Docteur <NAME>"),
    "Docteur_PRENOM_NOM": ("Docteur DUPONT JEAN", "Docteur <NAME>"),
    "Docteur\n_PRENOM_NOM": ("Docteur\nDUPONT JEAN", "Docteur\n<NAME>"),
    "Monsieur_P._NOM": ("Monsieur J. Jean", "Monsieur <NAME>"),
    "Monsieur_P._NOM_MAJUSCULE": ("Monsieur J. JEAN", "Monsieur <NAME>"),
    "Monsieur_P._NOM_apostrophe": ("Monsieur J. L'Jean", "Monsieur <NAME>"),
    "Monsieur_P._NOM_apostrophe_MAJ": ("Monsieur J. L'JEAN", "Monsieur <NAME>"),
    "Dr_NOM_Prenom": ("Dr LECLERC Charle", "Dr <NAME>"),
    "Dr_Prenom_NOM": ("Dr Charle LECLERC", "Dr <NAME>"),
    "Dr_P._P._NOM": ("Dr J.F. LECLERC", "Dr <NAME>"),
    "Dr_P._P._Nom": ("Dr J.F. Laclerc", "Dr <NAME>"),
    "Dr_P._P._NOM_2": ("Dr J. LECLERC", "Dr <NAME>"),
    "Dr_P._P._NOM_3": ("Dr J. LECLERC", "Dr <NAME>"),
    "Professeur_P._de_NOM": ("Professeur L. de LALALAND", "Professeur <NAME>"),
    "Professeur_P._du_NOM": ("Professeur L. du LALALAND", "Professeur <NAME>"),
    "Professeur_P._DE_NOM": ("Professeur L. DE LALALAND", "Professeur <NAME>"),
    "Professeur_P._DU_NOM": ("Professeur L. DU LALALAND", "Professeur <NAME>"),
    "Chef_de_service_P._NOM": ("Chef de service L. LARIDE", "Chef de service <NAME>"),
    "Cheffe_de_service_P._NOM": (
        "Cheffe de service L. LARIDE",
        "Cheffe de service <NAME>",
    ),
    "Mme_P._NOM": ("Mme C. CCCCC", "Mme <NAME>"),
    "DR._NOM": ("DR. LECLERC", "DR. <NAME>"),
    "PR_NAME": ("PR ABGRAL RONAN", "PR <NAME>"),
    "Interne_NOM_Prenom": ("Interne JEAN Jean", "Interne <NAME>"),
    "Externe_NOM_Prenom": ("Externe JEAN Jean", "Externe <NAME>"),
    "nom_phone": (
        "Monsieur JEAN Lasalle, tél : 0647482884",
        "Monsieur <NAME>, tél : <NUMBER>",
    ),
    "double_nom": (
        "Monsieur JEAN Jean, Docteur Jeanj JEAN, Madame JEANNE Jean",
        "Monsieur <NAME>, Docteur <NAME>, Madame <NAME>",
    ),
    "test": (
        "Bonjour Monsieur JEAN Jean, voici son numéro : 0606060606 et son email jean.jean@gmail.fr",
        "Bonjour Monsieur <NAME>, voici son numéro : <NUMBER> et son email <EMAIL>",
    ),
    "née_madame": ("Madame DUPONT Mariane née MORGAT", "Madame <NAME> née <NAME>"),
    "née_madame_2": ("Nom : DUPONT Mariane née MORGAT", "Nom : <NAME> née <NAME>"),
    "né_monsieur": ("Monsieur J. Jean né LA RUE", "Monsieur <NAME> né <NAME>"),
    "test_None": (None, "NaN"),
    "Prof_NOM_PRENOM": ("Professeur JEAN JEAN", "Professeur <NAME>"),
    "Profe_NOM_PRENOM": ("Professeure JEAN JEAN", "Professeure <NAME>"),
    "INT_NOM_PRENOM": ("INT JEAN JEAN", "INT <NAME>"),
    "Date_/": ("01/12/2000", "<DATE>"),
    "Date_-": ("01-12-2000", "<DATE>"),
    "Date_-": ("01-12-2000", "<DATE>"),
    "Date_incorrect": ("12-22-2000", "12-22-2000"),
    "Date_phrase": ("Brest, le 01/01/2000", "Brest, le <DATE>"),
    "adresse_2": ("155 rue de Brest, 29820, Guilers", "<ADRESSE>"),
    "adresse_3": ("28 RUE DU CHATEAU", "<ADRESSE>"),
    "adresse_4": ("20, bis rue de la Plage", "20, bis <ADRESSE>"),
    "date_mois": ("8 juillet 2020", "<DATE>"),
    "date_fourchette": ("du 15 au 24 octobre 2015", "du 15 au <DATE>"),
    "ville_date": ("BREST, le 4 Juin 2015", "BREST, le <DATE>"),
    "date_.": ("née le 27.05.31", "née le <DATE>"),
    "zip_name": ("29760 PENMARCH", "<ADRESSE>"),
    "zip_name_2": ("29270 CARHAIX PLOUGUER", "<ADRESSE>"),
    "zip_name_3": ("29270 AIX-EN-PROVENCE", "<ADRESSE>"),
}


datas_regex = list(dataset_regex.values())
ids_regex = list(dataset_regex.keys())


@pytest.mark.parametrize("input,output", datas_regex, ids=ids_regex)
def test_regex_strategie(input, output):

    ano = Anonymizer()
    ano.add_analyzer("regex")
    ano.set_mask("placeholder")
    assert ano.anonymize(input) == output


infos = {
    "first_name": "Lea",
    "last_name": "Jungels",
    "birth_name": "",
    "birthdate": datetime(1992, 9, 22, 0, 0, 0),
    "ipp": "0987654321",
    "postal_code": "01000",
    "adress": "",
}
dataset_pii = {
    "Nom_Prenom_PII": ("Léa Jungels", "<NAME> <NAME>"),
    "Date_IPP_Postal": ("22/09/1992 0987654321 01000", "<DATE> <IPP> <CODE_POSTAL>"),
    "DN": ("DN : 22/09/1992 ", "DN : <DATE> "),
}

datas_pii = list(dataset_pii.values())
ids_pii = list(dataset_pii.keys())


@pytest.mark.parametrize("input,output", datas_pii, ids=ids_pii)
def test_pii_strategie(input, output):
    ano = Anonymizer()
    ano.set_info_from_dict(**infos)
    ano.add_analyzer("pii")
    ano.set_mask("placeholder")
    assert ano.anonymize(input) == output


def test_anaylser_not_implemented_error():
    with pytest.raises(NotImplementedError):
        analyzer.AnalyzerStrategy.analyze(text="test")


def test_mask_not_implemented_error():
    with pytest.raises(NotImplementedError):
        mask.Strategy.mask("test", coordinate=((10, 10), "<TEST>"))


def test_add_analyser_error():
    ano = Anonymizer()
    with pytest.raises(Exception, match="test analyzer doesn't exist"):
        ano.add_analyzer("test")


def test_set_mask_error():
    ano = Anonymizer()
    with pytest.raises(Exception):
        ano.set_mask("test")


def test_set_annotator_error():
    ano = Anonymizer()
    with pytest.raises(Exception):
        ano.set_annotator("test")


dataset_regex = {
    "NOM_Prenom": ("name : DUPONT Jean", "name : <NAME>"),
    "Prenom_NOM": ("name : Jean DUPONT", "name : <NAME>"),
    "Prenom_NOM_2": ("Karine LACUT", "<NAME>"),
    "Prenom_NOM_3": ("   Jean DUPONT", "   <NAME>"),
    "N._Prenom": ("name : D. Jean", "name : <NAME>"),
    "N.-N._Prenom": ("name: D.D. Jean", "name: <NAME>"),
    "N_Prenom": ("L Johan", "<NAME>"),
    "NOM_Prenom_Composee": ("LARIDE Jean Philippe", "<NAME>"),
    "NOM_Prenom_Composee_2": ("LA RIDE Jean François", "<NAME>"),
    "Prenom_NOM_appostrophe": ("Jean HOC'H", "<NAME>"),
}


datas_regex = list(dataset_regex.values())
ids_regex = list(dataset_regex.keys())


@pytest.mark.parametrize("input,output", datas_regex, ids=ids_regex)
def test_lossy_strategie(input, output):

    ano = Anonymizer()
    ano.add_analyzer("lossy")
    ano.set_mask("placeholder")
    assert ano.anonymize(input) == output


dataset_regex = {
    "NOM_Prenom": ("Jeanne ALLEE", "<NAME>"),
    "word_test": ("l'incapacité de marcher par elle même", "l'incapacité de marcher par elle même"),
    "Monsieur_NOM_Prenom": ("Monsieur VIDAL Jean", "Monsieur <NAME>"),
    "medical_sentense": ("Voie orale, pendant 1 Mois", "Voie orale, pendant 1 Mois"),
}


datas_regex = list(dataset_regex.values())
ids_regex = list(dataset_regex.keys())


@pytest.mark.parametrize("input,output", datas_regex, ids=ids_regex)
def test_full_strategies(input, output):

    ano = Anonymizer()
    ano.add_analyzer("regex")
    ano.add_analyzer("lossy")
    ano.set_mask("placeholder")
    assert ano.anonymize(input) == output
