// ==========================================================================
// Author:  Yee Hsu
// Date:    8/5/2008
// File:    String.cpp
//
// Desc:    Big Brother Server Monitor
// ==========================================================================

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Net.Mail;

namespace BigBrotherEx
{
    class BBStruct
    {
        public int nUpdateId;
        public int nTimeStamp;

        public string sVendorName;
        public string sDefDate;
        public string sDefVersion;
        public string sEngVersion;
        public string sStatus;
    };

    class Monitor
    {
        public XmlTextReader xmlReader;
        public Dictionary<int, BBStruct> bbdata;

        public Monitor()
        {
            this.xmlReader = null;
            this.bbdata = new Dictionary<int, BBStruct>();
        }

        public void ParseBigBrother(string sFileName)
        {
            this.xmlReader = new XmlTextReader(sFileName);

            // move xml reader to the node we want...
            while (xmlReader.Read())
            {
                if (xmlReader.NodeType == XmlNodeType.Element)
                {
                    if (xmlReader.LocalName == "Monitor")
                    {
                        if (xmlReader.GetAttribute("Item") == "GSX")
                            break;
                    }
                }
            }

            // now start parsing...
            while (xmlReader.Read())
            {
                if (xmlReader.NodeType == XmlNodeType.Element)
                {
                    if (xmlReader.LocalName == "VM")
                    {
                        BBStruct bbstruct = new BBStruct();

                        bbstruct.nUpdateId = int.Parse(xmlReader.GetAttribute("UpdateId"));
                        bbstruct.nTimeStamp = int.Parse(xmlReader.GetAttribute("TimeStamp"));
                        bbstruct.sVendorName = xmlReader.GetAttribute("VendorName");

                        bbstruct.sDefDate = xmlReader.GetAttribute("DefDate");
                        bbstruct.sDefVersion = xmlReader.GetAttribute("DefVersion");
                        bbstruct.sEngVersion = xmlReader.GetAttribute("EngVersion");
                        bbstruct.sStatus = xmlReader.GetAttribute("Status");

                        this.bbdata.Add(bbstruct.nUpdateId, bbstruct);
                    }
                }
            }
        }

        public void DisplayWarningVMs()
        {
            foreach (KeyValuePair<int, BBStruct> bMap in this.bbdata)
            {
                if (bMap.Value.sStatus.Equals("Yellow") == true || bMap.Value.sStatus.Equals("Red"))
                {
                    Console.Write(bMap.Value.nUpdateId + " ");
                    Console.Write(bMap.Value.nTimeStamp + " ");
                    Console.Write(bMap.Value.sVendorName + " ");
                    Console.Write(bMap.Value.sDefDate + " ");
                    Console.Write(bMap.Value.sDefVersion + " ");
                    Console.Write(bMap.Value.sEngVersion + " ");
                    Console.Write(bMap.Value.sStatus + " ");
                    Console.WriteLine();
                }
            }
        }

        public void SendEmailWithVMErrors()
        {
            string sEmailString = "";

            // header
            sEmailString += "\r\n";
            sEmailString += "Date: " + DateTime.Now.ToString();
            sEmailString += "\r\n";
            sEmailString += "\r\n";
            sEmailString += "GSX Virtual Machine Errors...";

            // red status
            sEmailString += "\r\n";
            sEmailString += "\r\n";
            sEmailString += "RED Status\r\n";
            sEmailString += "============================================================================\r\n";

            foreach (KeyValuePair<int, BBStruct> bMap in this.bbdata)
            {
                if (bMap.Value.sStatus.Equals("Red"))
                {
                    string sLine = string.Format("{0,-10}{1,-50}{2}",
                        bMap.Value.nUpdateId, bMap.Value.sVendorName, bMap.Value.sDefDate);

                    sEmailString += sLine;
                    sEmailString += "\r\n";
                }
            }

            // yellow status
            sEmailString += "\r\n";
            sEmailString += "\r\n";
            sEmailString += "YELLOW Status\r\n";
            sEmailString += "============================================================================\r\n";

            foreach (KeyValuePair<int, BBStruct> bMap in this.bbdata)
            {
                if (bMap.Value.sStatus.Equals("Yellow"))
                {
                    string sLine = string.Format("{0,-10}{1,-50}{2}", 
                        bMap.Value.nUpdateId, bMap.Value.sVendorName, bMap.Value.sDefDate);

                    sEmailString += sLine;
                    sEmailString += "\r\n";
                }
            }

            /*
            // lets send the email...
            MailMessage mail = new MailMessage();
            SmtpClient smtp = new SmtpClient("smtp.domain.net");

            mail.From = new MailAddress("bigbrother@company.com");
            mail.To.Add("email@company.com");
            //mail.To.Add("bb_qa@company.com");
            mail.Subject = "BigBrother GSX VM Warnings!";            
            mail.Body = sEmailString;           
            smtp.Send(mail);
             * */

            MailMessage mail = new MailMessage();
            SmtpClient smtp = new SmtpClient("smtp.domain.com");

            mail.From = new MailAddress("bigbrother@company.com");
            mail.To.Add("mail@bbmonitor.com");
            mail.Subject = "BigBrother GSX VM Warnings!";
            mail.Body = sEmailString;

            System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("bigbrother@bbmonitor.com", "password");
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = SMTPUserInfo;
            smtp.Send(mail);
        }
    }
}