var should = require("should");
var sinon = require("sinon");
var helper = require("node-red-node-test-helper");
var emailNode = require('../../../social/email/61-email.js');

describe('email Node', function () {

    beforeEach(function (done) {
        helper.startServer(done);
    });

    afterEach(function (done) {
        helper.unload();
        helper.stopServer(done);
    });

    describe('email in', function () {

        it('should load with defaults', function (done) {
            var flow = [{
                id: "n1",
                type: "e-mail in",
                name: "emailin",
                wires: [
                    []
                ]
            }];
            helper.load(emailNode, flow, function () {
                var n1 = helper.getNode("n1");
                n1.should.have.property('name', "emailin");
                n1.should.have.property("repeat", 300000);
                n1.should.have.property("inserver", "imap.gmail.com");
                n1.should.have.property("inport", "993");
                n1.should.have.property("authtype", "BASIC");
                done();
            });
        });

        it('should force input on XOAuth2', function (done) {
            var flow = [{
                id: "n1",
                type: "e-mail in",
                name: "emailin",
                authtype: "XOAUTH2",
                wires: [
                    []
                ]
            }];
            helper.load(emailNode, flow, function () {
                var n1 = helper.getNode("n1");
                n1.should.have.property("repeat", 0);
                n1.should.have.property("inputs", 1);
                done();
            });
        });
    });

    describe('email out', function () {

        it('should load with defaults', function (done) {
            var flow = [{
                id: "n1",
                type: "e-mail",
                name: "emailout",
                port: 1025,
                wires: [
                    []
                ]
            }];
            helper.load(emailNode, flow, function () {
                var n1 = helper.getNode("n1");
                n1.should.have.property('name', "emailout");
                n1.should.have.property("authtype", "BASIC");
                done();
            });
        });

        it('should fail with no payload', function (done) {
            var flow = [{
                id: "n1",
                type: "e-mail",
                name: "emailout",
                wires: [
                    []
                ]
            }];
            helper.load(emailNode, flow, function () {
                var n1 = helper.getNode("n1");
                n1.credentials = {
                    userid: "test",
                    password: "test",
                };
                n1.emit("input", {});
                //done();
            });
            setTimeout(function () {
                try {
                    var logEvents = helper.log().args.filter(function (evt) {
                        //console.log(evt[0].msg);
                        return evt[0].type == "e-mail";
                    });
                    //console.log(helper.log().args);
                    //console.log(helper.log());
                    //logEvents.should.have.length(3);
                    logEvents[0][0].should.have.a.property('msg');
                    logEvents[2][0].msg.toString().should.startWith("email.errors.nopayload");
                    done();
                } catch (e) {
                    done(e);
                }
                //finally { smtpTransport.sendMail.restore(); }
            }, 1500);
        });

        it('should fail to send an email (invalid creds)', function (done) {
            //var smtpTransport = require("nodemailer").createTransport();
            //var spy = sinon.stub(smtpTransport, 'sendMail', function(arg1,arg2,arg3,arg4) {
            //console.log("HELLO");
            //console.log(arg1,arg2,arg3,arg4);
            //done();
            //});
            var flow = [{
                id: "n1",
                type: "e-mail",
                name: "test@gmail.com",
                server: "smtp.gmail.com",
                secure: true,
                port: "465",
                wires: [
                    []
                ]
            }];
            helper.load(emailNode, flow, function () {
                var n1 = helper.getNode("n1");
                n1.credentials = {
                    userid: "test",
                    password: "test",
                };
                n1.should.have.property('name', "test@gmail.com");
                n1.emit("input", {
                    payload: "Hello World",
                    to: "test@gmail.com"
                });
                //done();
            });
            setTimeout(function () {
                try {
                    var logEvents = helper.log().args.filter(function (evt) {
                        //console.log(evt[0].msg);
                        return evt[0].type == "e-mail";
                    });
                    // console.log(helper.log().args);
                    // console.log(helper.log());
                    // console.log(logEvents[0][0].msg.toString());
                    //logEvents.should.have.length(3);
                    logEvents[0][0].should.have.a.property('msg');
                    logEvents[2][0].msg.toString().should.startWith("Error:");
                    done();
                } catch (e) {
                    done(e);
                }
                //finally { smtpTransport.sendMail.restore(); }
            }, 1900);
        })

        it('should fail to send an email (no creds provided)', function (done) {
            //var smtpTransport = require("nodemailer").createTransport();
            //var spy = sinon.stub(smtpTransport, 'sendMail', function(arg1,arg2,arg3,arg4) {
            //console.log("HELLO");
            //console.log(arg1,arg2,arg3,arg4);
            //done();
            //});
            var flow = [{
                id: "n1",
                type: "e-mail",
                name: "test@gmail.com",
                server: "smtp.gmail.com",
                secure: true,
                port: "465",
                wires: [
                    []
                ]
            }];
            helper.load(emailNode, flow, function () {
                var n1 = helper.getNode("n1");
                n1.should.have.property('name', "test@gmail.com");
                n1.emit("input", {
                    payload: "Hello World",
                    to: "test@gmail.com"
                });
                //done();
            });
            setTimeout(function () {
                try {
                    var logEvents = helper.log().args.filter(function (evt) {
                        //console.log(evt[0].msg);
                        return evt[0].type == "e-mail";
                    });
                    //console.log(helper.log().args);
                    //logEvents.should.have.length(3);
                    logEvents[0][0].should.have.a.property('msg');
                    logEvents[2][0].msg.toString().should.startWith("Error:");
                    done();
                } catch (e) {
                    done(e);
                }
                //finally { smtpTransport.sendMail.restore(); }
            }, 1900);
        })

    });

    describe('email mta', function () {

        it('should catch an email send to localhost 1025', function (done) {
            var flow = [{
                id: "n1",
                type: "e-mail mta",
                name: "emailmta",
                port: 1025,
                wires: [
                    ["n2"]
                ]
            },
            {
                id:"n2",
                type:"helper"
            },
            {
                id: "n3",
                type: "e-mail",
                dname: "testout",
                server: "localhost",
                secure: false,
                port: 1025,
                wires: [
                    []
                ]
            }];
            helper.load(emailNode, flow, function () {
                var n1 = helper.getNode("n1");
                var n2 = helper.getNode("n2");
                var n3 = helper.getNode("n3");
                n1.should.have.property('port', 1025);

                n2.on("input", function(msg) {
                    //console.log("GOT",msg);
                    try {
                        msg.should.have.a.property("payload",'Hello World\n');
                        msg.should.have.a.property("topic","Test");
                        msg.should.have.a.property("from",'foo@example.com');
                        msg.should.have.a.property("to",'bar@example.com');
                        msg.should.have.a.property("attachments");
                        msg.should.have.a.property("header");
                        done();
                    }
                    catch(e) {
                        done(e)
                    }
                });

                n3.emit("input", {
                    payload: "Hello World",
                    topic: "Test",
                    from: "foo@example.com",
                    to: "bar@example.com"
                });
                //done();
            });
        });
    });
});