using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using System.Xml;
using Baza_Reklam.Classes.Interfaces;
using Microsoft.Reporting.WinForms;

namespace Baza_Reklam
{
    public partial class ReportsForm : Form, IForm
    {
        private static ReportsForm reportsForm;

        private readonly string reportsCatalog = "";

        public static ReportsForm getReportsForm(MDIBazaReklam parent)
        {
            if (reportsForm == null) reportsForm = new ReportsForm(parent);
            return reportsForm;
        }

        private ReportsForm(Form parent)
        {
            InitializeComponent();

            MdiParent = parent;

            reportViewer1.ServerReport.ReportServerUrl = new Uri(Properties.Settings.Default.reportsServer);

            reportsCatalog = "Zestawienia";

            InitTreeView(stareRaportyTreeView);
            
            wczytajRaporty();
            wczytajNoweRaporty();
        }

        private void ReportsForm_Load(object sender, EventArgs e)
        {
            WindowState = FormWindowState.Maximized;
        }

        /// <summary>
        /// Wczytuje raporty do drzewka
        /// </summary>
        private void wczytajRaporty() {
            TreeNode node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/ListaReklamNaWydanieNr";
            node.Text = "Lista reklam na wydanie";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/zestawienieDTP";
            node.Text = "Zestawienie czasu produkcji";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/zestawienieDTP2";
            node.Text = "Średni czas produkcji DTP";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/zestawienieKOREKTA";
            node.Text = "Średni czas produkcji - KOREKTA";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);
            
            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/PorownanieListReklam";
            node.Text = "Porównanie list reklam";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/ReklamyDoUsuniecia";
            node.Text = "Reklamy do usunięcia";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/ReklamyDoDodania";
            node.Text = "Reklamy do dodania";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/ReklamaWInternecie";
            node.Text = "Reklama w Internecie";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/ListaReklamA3";
            node.Text = "Lista reklam A3";
            stareRaportyTreeView.Nodes["Produkcja"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/testowyAll";
            node.Text = "Raport testowy";
            stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

            node = new TreeNode();
            node.Name = "/" + reportsCatalog + "/testowyAll2";
            node.Text = "Raport testowy 2";
            stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

            if (User.Instance().IsHandlowiec | User.Instance().IsKierownik | User.Instance().IsSekretarka)
            {
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/ZestawienieMiesieczneFaktur";
                node.Text = "Zestawienie miesięczne faktur";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);
               
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/SprzedazReklam";
                node.Text = "Sprzedaż reklam";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);
              
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/Zaleglosci";
                node.Text = "Zaległości";
                stareRaportyTreeView.Nodes["Zaległości"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/RozliczenieProwizjiZaReklame";
                node.Text = "Rozliczenie prowizji za reklamę";
                stareRaportyTreeView.Nodes["Wpływy"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/RozliczenieWplywowWgDatyWplaty2";
                node.Text = "Rozliczenie wpływów wg daty wpłaty";
                stareRaportyTreeView.Nodes["Wpływy"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/PowtorzeniaEmisji";
                node.Text = "Powtórzenia emisji";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/ZestawienieKontaktow";
                node.Text = "Zestawienie kontaktów";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/Logi";
                node.Text = "Logi - zamówienia";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/LogiKlient";
                node.Text = "Logi - klient 1";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/LogiKlient2";
                node.Text = "Logi - klient 2";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/BrakKontaktu";
                node.Text = "Brak kontaktu";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);
            }

            if (User.Instance().IsHandlowiec | User.Instance().IsKierownik)
            {                
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WynikAgenta";
                node.Text = "Wynik agenta";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);
                
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/PodsumowanieRoczneWedlugZamowien";
                node.Text = "Podsumowanie roczne według zamówień";
                stareRaportyTreeView.Nodes["Analiza sprzedaży"].Nodes.Add(node);
                                
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/OcenaAgenta";
                node.Text = "Ocena agentów";
                stareRaportyTreeView.Nodes["Wpływy"].Nodes.Add(node);
            }

            if (User.Instance().IsKierownik) {

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/SprzedazReklamWYR";
                node.Text = "Sprzedaż reklam - wyróżnienia";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/RozliczenieWplywowWgDatyWplatyWYR";
                node.Text = "Rozliczenie wpływów - wyróżnienia";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/ZamowieniaVSFaktury";
                node.Text = "Zamówienia VS Faktury";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WynikAgencji";
                node.Text = "Wynik Agencji";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/testowyVIP";
                node.Text = "Raport testowy VIP";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);
 
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/KosztyPrzychodyBiura";
                node.Text = "Przychody i koszty biura";
                stareRaportyTreeView.Nodes["Koszty biur"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/KosztyBiur";
                node.Text = "Koszty biur";
                stareRaportyTreeView.Nodes["Koszty biur"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/RankingKlientow";
                node.Text = "Ranking klientów";
                stareRaportyTreeView.Nodes["Rankingi"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/RankingAgentow";
                node.Text = "Ranking agentów";
                stareRaportyTreeView.Nodes["Rankingi"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykresWplywyNaNumer";
                node.Text = "Wykres wpływy na numer";
                stareRaportyTreeView.Nodes["Analiza sprzedaży"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykresPowierzchniReklam";
                node.Text = "Wykres powierzchni reklam";
                stareRaportyTreeView.Nodes["Analiza sprzedaży"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykresIloscReklamNaNumer";
                node.Text = "Wykres ilość reklam na numer";
                stareRaportyTreeView.Nodes["Analiza sprzedaży"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/ZestawienieMiesieczneAgencjeIlosc";
                node.Text = "Zestawienie miesięczne agencje - ilość";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/ZestawienieMiesieczneAgencje";
                node.Text = "Zestawienie miesięczne - agencje";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykonanieBudzetu";
                node.Text = "Wykonanie budżetu 1";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykonanieBudzetu2";
                node.Text = "Wykonanie budżetu 2";
                stareRaportyTreeView.Nodes["Pozostałe"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/SprzedazNaWydanie";
                node.Text = "Sprzedaż na wydanie";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykresNettoIlosc";
                node.Text = "Netto-Ilość - zatwierdzone do druku";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykresNettoIlosc2";
                node.Text = "Netto-Ilość - zafakturowane";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykresNettoIlosc3";
                node.Text = "Netto-Ilość - zapłacone";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/WykresNettoIlosc4";
                node.Text = "Netto-Ilość - zapłacone i zafakturowane";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/NettoWgPanstw";
                node.Text = "Zestawienie wg państw";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);  
                 
                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/NettoWgPanstwMiesiecznie";
                node.Text = "Zestawienie miesięczne wg państw";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/NettoWgWojewodztwMiesiecznie";
                node.Text = "Zestawienie miesięczne wg województw";
                stareRaportyTreeView.Nodes["Sprzedaż"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/ZestawienieKontaktowCT_EXPO";
                node.Text = "Zestawienie Kontaktow CT_EXPO";
                stareRaportyTreeView.Nodes["Raporty_CT_EXPO"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/SprzedazReklamCT_EXPO";
                node.Text = "Sprzedaz Reklam CT_EXPO";
                stareRaportyTreeView.Nodes["Raporty_CT_EXPO"].Nodes.Add(node);

                node = new TreeNode();
                node.Name = "/" + reportsCatalog + "/RozliczenieWplywowWgDatyWplatyCT_EXPO";
                node.Text = "Rozliczenie Wplywow Wg Daty Wplaty CT_EXPO";
                stareRaportyTreeView.Nodes["Raporty_CT_EXPO"].Nodes.Add(node); 
            }
        }

        private static void InitTreeView(TreeView treeView)
        {
            TreeNode node = new TreeNode("Wpływy");
            node.Name = "Wpływy";
            treeView.Nodes.Add(node);

            node = new TreeNode("Sprzedaż");
            node.Name = "Sprzedaż";
            treeView.Nodes.Add(node);

            node = new TreeNode("Zaległości");
            node.Name = "Zaległości";
            treeView.Nodes.Add(node);

            node = new TreeNode("Koszty biur");
            node.Name = "Koszty biur";
            treeView.Nodes.Add(node);

            node = new TreeNode("Rankingi");
            node.Name = "Rankingi";
            treeView.Nodes.Add(node);

            node = new TreeNode("Analiza sprzedaży");
            node.Name = "Analiza sprzedaży";
            treeView.Nodes.Add(node);

            node = new TreeNode("Produkcja");
            node.Name = "Produkcja";
            treeView.Nodes.Add(node);

            node = new TreeNode("Pozostałe");
            node.Name = "Pozostałe";
            treeView.Nodes.Add(node);

            node = new TreeNode("Raporty_CT_EXPO");
            node.Name = "Raporty_CT_EXPO";
            treeView.Nodes.Add(node);

            return;
        }

        private static bool HasUserReportRights(XmlNode report)
        {
            if (report.Attributes["rights"] != null && !string.IsNullOrEmpty(report.Attributes["rights"].Value))
            {
                switch (report.Attributes["rights"].Value.ToLower())
                {
                    case "s":
                        return User.Instance().IsKierownik || User.Instance().IsHandlowiec || User.Instance().IsSekretarka;
                    case "h":
                        return User.Instance().IsKierownik || User.Instance().IsHandlowiec;
                    case "k":
                        return User.Instance().IsKierownik;
                    case "m":
                        return User.Instance().IsKsiegowosc;
                    case "a":
                        return User.Instance().IsAdmin;
                    default:
                        return false;
                }
            }

            return true;
        }

        private void wczytajNoweRaporty()
        {
            //zczytuje dane z pliku z tlumaczeniami
            Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("Baza_Reklam.Raporty.ReportsTree.xml");
            if (s == null) return;
            try
            {
                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(s);

                XmlNode newReportsNode = xmlDocument.SelectSingleNode("//New");

                foreach (XmlNode reportGroup in newReportsNode.ChildNodes)
                {
                    if (!HasUserReportRights(reportGroup)) continue;
                    
                    TreeNode reportGroupNode = new TreeNode(reportGroup.Attributes["text"].Value);
                    reportGroupNode.Name = reportGroup.Attributes["text"].Value;

                    foreach (XmlNode report in reportGroup.ChildNodes)
                    {
                        if(!HasUserReportRights(report)) continue;
                        if (string.IsNullOrEmpty(report.Attributes["path"].Value)) continue;

                        TreeNode reportNode = new TreeNode(report.Attributes["text"].Value);
                        reportNode.Name = string.Format("/{0}/{1}", reportsCatalog, report.Attributes["path"].Value);
                        reportGroupNode.Nodes.Add(reportNode);
                    }
                    raportyTreeView.Nodes.Add(reportGroupNode);
                }
            }
            finally
            {
                s.Close();
                s.Dispose();
            }
            return;

            //foreach (TreeNode treeNode in raportyTreeView.Nodes)
            //{
            //    Debug.WriteLine(treeNode.Text);
            //    foreach (TreeNode t in treeNode.Nodes)
            //    {
           //        System.Diagnostics.Debug.WriteLine("  - " + t.Text);    
            //    }

            //}
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            switch (e.Node.Level) { 
                case 0:
                    break;
                case 1:
                    Cursor = Cursors.WaitCursor;

                    reportViewer1.ServerReport.ReportPath = e.Node.Name;

                    if (reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/ZestawienieMiesieczneFaktur" |
                        reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/ZestawienieMiesieczneFaktur2009" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/ZestawienieKontaktow" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/RozliczenieWplywowWgDatyWplaty2" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/RozliczenieWplywowWgDatyWplaty2009" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/RozliczenieProwizjiZaReklame" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/RozliczenieProwizjiZaReklame2009" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/SzacowanieSprzedazy"
                       )
                    {
                        if (!User.Instance().IsKierownik)
                        { 
                            if (User.Instance().IsSekretarka)
                            {
                                List<ReportParameter> paramList = new List<ReportParameter>();
                                paramList.Add(new ReportParameter("prawa_agencje", User.Instance().IdAgencji.ToString(), true));
                                reportViewer1.ServerReport.SetParameters(paramList);
                            }
                            else if (User.Instance().IsHandlowiec)
                            {
                                List<ReportParameter> paramList = new List<ReportParameter>();
                                paramList.Add(new ReportParameter("prawa_agencje", User.Instance().IdAgencji.ToString(), true));
                                paramList.Add(new ReportParameter("prawa_agent", User.Instance().Symbol_agenta, true));
                                reportViewer1.ServerReport.SetParameters(paramList);

                            }
                        }
                    }

                    if (reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/Zaleglosci" |
                        reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/Zaleglosci2009" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/WynikAgencji" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/SprzedazReklam" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/SprzedazReklam2009" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/RozliczenieProwizjiZaReklame" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/RozliczenieProwizjiZaReklame2009" |
                       reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/OcenaAgenta")
                    {
                        if (!User.Instance().IsKierownik)
                        {
                            List<ReportParameter> paramList = new List<ReportParameter>();
                            paramList.Add(new ReportParameter("prawa_agencje", User.Instance().IdAgencji.ToString(), true));
                            reportViewer1.ServerReport.SetParameters(paramList);
                        }
                    }

                    if (reportViewer1.ServerReport.ReportPath == "/" + reportsCatalog + "/WynikAgenta")                  
                    {
                        if (!User.Instance().IsKierownik)
                        {
                            List<ReportParameter> paramList = new List<ReportParameter>();
                            paramList.Add(new ReportParameter("prawa_agent", User.Instance().Symbol_agenta, true));
                            reportViewer1.ServerReport.SetParameters(paramList);
                        }
                    }

                    reportViewer1.RefreshReport();

                    Cursor = Cursors.Default;
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// Ukrywa drzewko z listą raportów.
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            splitContainer1.Panel1Collapsed = splitContainer1.Panel1Collapsed ? false : true;
        }

        public void CloseForm()
        {
            reportsForm = null;
        }
    }
}