#include <string>
#include "EPoll.h"
#include "ConsoleServer.h"
#include "Exception.h"
#include "File.h"
#include "Log.h"
#include "IPAddress.h"
#include "MailFileSystem.h"
#include "SMTPServer.h"
#include "POP3Server.h"
#include "IMAPServer.h"
#include "SendMail2.h"
#include <fcntl.h>
#include <iostream>

int main(int argc, char **argv) {
   coreutils::Log(new coreutils::File("/var/log/barantmail.log", O_WRONLY | O_APPEND | O_CREAT, 0644));
   coreutils::Log(coreutils::LOG_INFO) << "BMAMAIL called with link " << argv[0];
   std::string  arg = argv[0];
   if(arg.substr(arg.find_last_of("\\/") + 1) == "sendmail2") {
      try {
         coreutils::Log(coreutils::LOG_INFO) << "Starting Mail Injector. Build " << __DATE__ << " " << __TIME__;

         char buffer[1000000];
         int index = 0;
         int len = 0;
         while((len = read(0, &buffer[index], 1000000)) > 0)
           index += len;
         coreutils::MString message(buffer, index);
         coreutils::Log(coreutils::LOG_DEBUG_1) << "Number of bytes read: " << index;
         core::EPoll ePoll;
         ePoll.start(1, 1000);
         mail::SendMail2 mail2(ePoll, argv[1], argv[2], message);
         mail2.send();
         coreutils::Log(coreutils::LOG_DEBUG_1) << "waiting...";
         coreutils::MString rc(mail2.wait());
         coreutils::Log(coreutils::LOG_DEBUG_1) << "rc: " << rc;
         std::cout << rc;
      }
      catch(coreutils::Exception exception) {
         std::cout << exception.text << " Error reason is '" << strerror(exception.errorNumber) << "' in file " << exception.file << " at line " << exception.line << std::endl;
      }
   } else {

   try {

      coreutils::Log(coreutils::LOG_INFO) << "BMAMail Server starting. Build " << __DATE__ << " " << __TIME__;

      std::string hostName = "localhost";
      std::string ipAddress = "0.0.0.0";
      coreutils::ZString mailPath("/var/mail");

      mail::MailFileSystem mailFileSystem(mailPath);

      core::EPoll ePoll;
      ePoll.start(1, 1000);
      mail::SMTPServer smtpServer(ePoll, hostName, mailFileSystem, core::IPAddress(ipAddress, 9025));
//      mail::POP3Server pop3Server(ePoll, hostName, mailFileSystem, core::IPAddress(ipAddress, 110));
//      mail::IMAPServer imapServer(ePoll, hostName, mailFileSystem, core::IPAddress(ipAddress, 143));
      core::ConsoleServer consoleServer(ePoll, core::IPAddress(ipAddress, 1027));
      consoleServer.commands.add(consoleServer.commands, "help");
      consoleServer.commands.add(smtpServer.commands, "smtp");

      while(true)
        sleep(3600);

      ePoll.stop();

   }

   catch(coreutils::Exception exception) {
      std::cout << exception.text << " Error reason is '" << strerror(exception.errorNumber) << "' in file " << exception.file << " at line " << exception.line << std::endl;
   }
   }
}
