const {v4: uuidv4} = require("uuid");
const tesseract = require("node-tesseract-ocr");
const OCRResult = require("../models/OCRResult");
const Jimp = require('jimp');

function delay(delayInMs) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(2);
        }, delayInMs);
    });
}

const config = {
    lang: "eng",
    oem: 1,
    psm: 3,
}

const MESSAGE_URL_VALIDATION_FR = "envoyé un lien par e-mail."
const MESSAGE_URL_VALIDATION_FR_2 = "un lien par e-mail"
const MESSAGE_URL_VALIDATION_EN = "Please click on the link we sent by email"
const CAPTCHA_ERROR_MESSAGE = "Error verifying captcha, please try again"
const CAPTCHA_ERROR_MESSAGE_FR = "La vérification du captcha a échoué"
const BLOCKED_MSG_EN = "have been blocked"
const BLOCKED_MSG_FR = "avez été bloqué"
const CHECKING_MSG_FR = "Verifying"
const ERR_CACHE_MISS = "ERR_CACHE_MISS"
const ERR_CACHE_MISS_2 = "ERR_CACHE-MISS"
const ERR_CACHE_MISS_3 = "appuyer sur le bouton d'actualisation"
const ERR_CACHE_MISS_4 = "renvoyer les données"
const SLIDING_CAPTCHA_FR = "Pourquoi cette vérification"
const MESSAGE_FILL_FIELD_FR = "Demande de rendez-vous pour"
const WELCOME_MESSAGE_FR = "Bienvenue dans Chrome"
const PAGE_OPTIMIZATION_CHROME_FR = "Vous pouvez changer d'avis a tout moment dans"
const PAGE_OPTIMIZATION_CHROME_FR_2 = "Vous pouvez modifier vos options a tout moment"
const PAGE_OPTIMIZATION_CHROME_FR_3 = "Vous pouvez effectuer des modifications"
const PAGE_OPTIMIZATION_CHROME_FR_4 = "de nouvelles fonctionnalités"
const PAGE_OPTIMIZATION_CHROME_FR_5 = "Avec la mesure des performance"
const ONLINE_APPOINTMENT = "Online Appointment"
const CONFIRM_RESEND_FORM_FR = "Confirmer le nouvel envoi"
const CLOSED_MESSAGE_FR = "Depuis plus de 130 ans"
const DIALOG_TO_SKIP = "facilement les commandes"
const ABOUT_BLANK = "about:blank"
const GOOGLE_DISCONNECT_FR = "Rester déconnecté"
const RECAPTCHA_FAILED_FR = "captcha a échoué"

async function convertImageToWhiteBlack(image_path) {
    const image = await Jimp.read(image_path);
    image.grayscale().write(image_path + ".wb");
    return image_path + ".wb";
}

class OCRChecker {

    constructor(device, contact) {
        this.device = device;
        this.contact = contact;
    }

    get_file_name() {
        let uuid = uuidv4();
        return this.contact.passportNumber + "_" + uuid + ".png"
    }


    async get_result() {
        let fileName = await this.take_screen_shot()
        let screenShot = await convertImageToWhiteBlack(fileName);
        try {
            let result = await tesseract
                .recognize(screenShot, config)
            console.log(result)
            if (result.includes(MESSAGE_URL_VALIDATION_EN) || result.includes(MESSAGE_URL_VALIDATION_FR) || result.includes(MESSAGE_URL_VALIDATION_FR_2)) {
                return OCRResult.SUCCESS
            } else if (result.includes(CAPTCHA_ERROR_MESSAGE) || result.includes(CAPTCHA_ERROR_MESSAGE_FR)) {
                return OCRResult.RECAPTCHA_ERROR
            } else if (result.includes(BLOCKED_MSG_EN) || result.includes(BLOCKED_MSG_FR)) {
                return OCRResult.BLOCKED
            } else if (result.includes(ERR_CACHE_MISS) || result.includes(ERR_CACHE_MISS_2) || result.includes(ERR_CACHE_MISS_3) || result.includes(ERR_CACHE_MISS_4)) {
                return OCRResult.TO_REFRESH
            } else if (result.includes(CHECKING_MSG_FR)) {
                return OCRResult.RECHECK
            } else if (result.includes(SLIDING_CAPTCHA_FR)) {
                return OCRResult.SLIDING_CAPTCHA
            } else if (result.includes(MESSAGE_FILL_FIELD_FR)) {
                return OCRResult.FILL_FIELD
            } else if (result.includes(WELCOME_MESSAGE_FR)) {
                return OCRResult.NEED_TO_CLICK_LATE_BTN
            } else if (result.toLowerCase().includes(ONLINE_APPOINTMENT.toLowerCase())) {
                return OCRResult.ONLINE_APPOINTMENT
            } else if (result.includes(PAGE_OPTIMIZATION_CHROME_FR) || result.includes(PAGE_OPTIMIZATION_CHROME_FR_2) || result.includes(PAGE_OPTIMIZATION_CHROME_FR_3) || result.includes(PAGE_OPTIMIZATION_CHROME_FR_4) || result.includes(PAGE_OPTIMIZATION_CHROME_FR_5)) {
                return OCRResult.PAGE_OPTIMIZATION
            } else if (result.includes(CONFIRM_RESEND_FORM_FR)) {
                return OCRResult.CONFIRM_RESEND_FORM
            } else if (result.includes(CLOSED_MESSAGE_FR)) {
                return OCRResult.CLOSED
            } else if (result.includes(ABOUT_BLANK)) {
                return OCRResult.TERMINAED
            } else if (result.includes(DIALOG_TO_SKIP)) {
                return OCRResult.TO_SKIP
            } else if (result.includes(GOOGLE_DISCONNECT_FR)) {
                return OCRResult.GOOGLE_DISCONNECT
            } else if (result.includes(RECAPTCHA_FAILED_FR)) {
                return OCRResult.TERMINAED
            } else {
                return OCRResult.TERMINAED
            }
        } catch (e) {
            console.log(e)
            return OCRResult.RECHECK
        }

    }

    async take_screen_shot() {
        let name = this.get_file_name()
        await this.device.screenshot({path: name});
        await delay(1000);
        return name
        // console.log(`stdout: ${stdout1}`);
    }
}

module.exports = OCRChecker
