using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using Kreta.DataAccess.Interfaces;
using Kreta.DataAccessManual.Interfaces;
using Kreta.DataAccessManual.Util;
using SDA.Kreta.Entities;

namespace Kreta.DataAccessManual
{
    internal class DashboardUzenetDal : DataAccessBase, IDashboardUzenetDal
    {
        public DashboardUzenetDal(DalHandler handler) : base(handler)
        {
        }

        #region BaseCRUD

        public void Delete(IDashboardUzenet dto)
        {
            var entity = dto as DashboardUzenet;
            entity.Delete(false);
            DalHelper.Commit();
        }

        public void Delete(int id)
        {
            var entity = DashboardUzenet.GiveAnInstance();
            entity.LoadByID(id);
            entity.Delete();
            DalHelper.Commit();
        }

        public IDashboardUzenet Get()
        {
            return DashboardUzenet.GiveAnInstance();
        }

        public IDashboardUzenet Get(int id)
        {
            var entity = DashboardUzenet.GiveAnInstance();
            entity.LoadByID(id);
            return entity;
        }

        public void Insert(IDashboardUzenet dto)
        {
            var entity = dto as DashboardUzenet;
            entity.Insert();
            dto.ID = entity.ID;
            DalHelper.Commit();
        }

        public void Update(IDashboardUzenet dto)
        {
            var entity = dto as DashboardUzenet;
            entity.Update();
            DalHelper.Commit();
        }

        #endregion

        public DataSet GetLoginDashboardUzenet()
        {
            var commandText = @"
                SELECT TOP 1
                   d.C_CIM
                  ,d.C_TARTALOM
                FROM T_DASHBOARDUZENET d
                WHERE d.TOROLT = 'F'
                  AND d.C_EGYEDIAZONOSITO = 'LOGINRENDSZERERTESITES'
                  AND d.C_ISADMIN = 'T'
            ";

            return GetData(commandText);
        }

        public DataSet GetAdminDashboardUzenetDataSet(int felhasznaloId)
        {
            var parameters = new List<CommandParameter>
            { new CommandParameter("pFelhasznaloId", felhasznaloId) };

            var commandText = @"
            SELECT DISTINCT * FROM (
              SELECT
                 d.C_CIM
                ,d.C_EGYEDIAZONOSITO
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 0, d.C_SORREND) as SORREND
                ,d.C_TARTALOM
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 4, d.C_DASHBOARDUZENETKATEGORIAID) as C_DASHBOARDUZENETKATEGORIAID
                ,d.C_KIEMELTIDOSZAKVEGE
              FROM T_DASHBOARDUZENET d
              WHERE d.TOROLT = 'F'
                AND d.C_ISPOPUP = 'F'
                AND d.C_ISINTEZMENYI = 'F'
                AND d.C_ISFELHASZNALOI = 'F'
                AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                AND d.C_ISADMIN = 'T'
            UNION
              SELECT
                 d.C_CIM
                ,d.C_EGYEDIAZONOSITO
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 0, d.C_SORREND) as SORREND
                ,COALESCE(di.C_TARTALOM, d.C_TARTALOM) AS C_TARTALOM
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 4, d.C_DASHBOARDUZENETKATEGORIAID) as C_DASHBOARDUZENETKATEGORIAID
                ,d.C_KIEMELTIDOSZAKVEGE
              FROM T_DASHBOARDUZENET d
                INNER JOIN T_DASHBOARDUZENETINTEZMENY di ON di.C_DASHBOARDUZENETID = d.ID AND di.TOROLT = 'F'
              WHERE d.TOROLT = 'F'
                AND d.C_ISPOPUP = 'F'
                AND d.C_ISINTEZMENYI = 'T'
                AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                AND d.C_ISADMIN = 'T'
            UNION
              SELECT
                 d.C_CIM
                ,d.C_EGYEDIAZONOSITO
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 0, d.C_SORREND) as SORREND
                ,d.C_TARTALOM AS C_TARTALOM
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 4, d.C_DASHBOARDUZENETKATEGORIAID) as C_DASHBOARDUZENETKATEGORIAID
                ,d.C_KIEMELTIDOSZAKVEGE
              FROM T_DASHBOARDUZENET d
                INNER JOIN T_DASHBOARDUZENETFELHASZNALO df ON df.C_DASHBOARDUZENETID = d.ID AND df.TOROLT = 'F'
              WHERE d.TOROLT = 'F'
                AND d.C_ISPOPUP = 'F'
                AND d.C_ISFELHASZNALOI = 'T'
                AND df.C_FELHASZNALOID = :pFelhasznaloId
                AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                AND d.C_ISADMIN = 'T'
            ) AS x
            ORDER BY x.SORREND
            ";

            return GetData(commandText, parameters);
        }

        public DataSet GetTanarDashboardUzenetDataSet(int felhasznaloId)
        {
            var parameters = new List<CommandParameter>
            { new CommandParameter("pFelhasznaloId", felhasznaloId) };

            var commandText = @"
            SELECT DISTINCT * FROM (
              SELECT
                 d.C_CIM
                ,d.C_EGYEDIAZONOSITO
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 0, d.C_SORREND) as SORREND
                ,d.C_TARTALOM
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 4, d.C_DASHBOARDUZENETKATEGORIAID) as C_DASHBOARDUZENETKATEGORIAID
                ,d.C_KIEMELTIDOSZAKVEGE
              FROM T_DASHBOARDUZENET d
              WHERE d.TOROLT = 'F'
                AND d.C_ISPOPUP = 'F'
                AND d.C_ISINTEZMENYI = 'F'
                AND d.C_ISFELHASZNALOI = 'F'
                AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                AND d.C_ISTANAR = 'T'
              UNION
              SELECT
                 d.C_CIM
                ,d.C_EGYEDIAZONOSITO
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 0, d.C_SORREND) as SORREND
                ,COALESCE(di.C_TARTALOM, d.C_TARTALOM) AS C_TARTALOM
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 4, d.C_DASHBOARDUZENETKATEGORIAID) as C_DASHBOARDUZENETKATEGORIAID
                ,d.C_KIEMELTIDOSZAKVEGE
              FROM T_DASHBOARDUZENET d
                INNER JOIN T_DASHBOARDUZENETINTEZMENY di ON di.C_DASHBOARDUZENETID = d.ID AND di.TOROLT = 'F'
              WHERE d.TOROLT = 'F'
                AND d.C_ISPOPUP = 'F'
                AND d.C_ISINTEZMENYI = 'T'
                AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                AND d.C_ISTANAR = 'T'
            UNION
              SELECT
                 d.C_CIM
                ,d.C_EGYEDIAZONOSITO
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 0, d.C_SORREND) as SORREND
                ,d.C_TARTALOM AS C_TARTALOM
                ,IIF(d.C_KIEMELTIDOSZAKVEGE IS NOT NULL AND d.C_KIEMELTIDOSZAKVEGE>GETDATE(), 4, d.C_DASHBOARDUZENETKATEGORIAID) as C_DASHBOARDUZENETKATEGORIAID
                ,d.C_KIEMELTIDOSZAKVEGE
              FROM T_DASHBOARDUZENET d
                INNER JOIN T_DASHBOARDUZENETFELHASZNALO df ON df.C_DASHBOARDUZENETID = d.ID AND df.TOROLT = 'F'
              WHERE d.TOROLT = 'F'
                AND d.C_ISPOPUP = 'F'
                AND d.C_ISFELHASZNALOI = 'T'
                AND df.C_FELHASZNALOID = :pFelhasznaloId
                AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                AND d.C_ISTANAR = 'T'
            ) AS x
            ORDER BY SORREND
            ";

            return GetData(commandText, parameters);
        }

        public DataSet GetDashboardEgyediAzonositokByIntezmeny(int intezmenyId)
        {
            var parameters = new List<CommandParameter>
            { new CommandParameter("pIntezmenyId", intezmenyId) };

            //FIXME: Ideiglenes megoldás csak! A T_BANK-ot ki kell majd váltani egy megfelelő (új) kapcsolótáblára!!!
            var commandText = /*@"
                SELECT d.C_EGYEDIAZONOSITO
                FROM T_DASHBOARDUZENET d
                INNER JOIN T_BANK_OSSZES tmp
                    INNER JOIN T_INTEZMENY i ON i.ID = tmp.C_INTEZMENYID
                    ON i.C_AZONOSITO = tmp.C_BANKNAME AND tmp.C_BANKNUMBER = 'LEPMODUL'
                WHERE d.TOROLT = 'F'
                    AND d.C_ISPOPUP = 'F'
                    AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                    AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                    AND d.C_EGYEDIAZONOSITO = 'LEPMODULNEMELERHETO'
                    AND i.ID = :pIntezmenyId
            "*/"SELECT '' AS C_EGYEDIAZONOSITO";

            return GetData(commandText, parameters);
        }

        public DataSet GetFeatureMaintenanceDashboardUzenet(string feature)
        {
            //Ha valamelyik feature-höz vagy oldalhoz kell "karbantartás" oldal,
            //akkor azt a T_DASHBOARDUZENET táblába az alábbi mintájára kell felvenni:
            string egyediAzonosito = string.Format("MAINTENANCE_{0}", feature.ToUpper());

            var commandText = $@"
                SELECT TOP 1
                   d.C_CIM
                  ,d.C_TARTALOM
                FROM T_DASHBOARDUZENET d
                WHERE d.TOROLT = 'F'
                  AND d.C_ISPOPUP = 'F'
                  AND d.C_ISINTEZMENYI = 'T'
                  AND (d.C_ERVENYESSEGKEZDETE <= GETDATE() OR d.C_ERVENYESSEGKEZDETE IS NULL)
                  AND (d.C_ERVENYESSEGVEGE > GETDATE() OR d.C_ERVENYESSEGVEGE IS NULL)
                  AND d.C_EGYEDIAZONOSITO = '{egyediAzonosito}'
                  AND d.C_ISADMIN = 'T'
            ";

            return GetData(commandText);
        }

        #region Dashboard Popup

        public DataSet GetDashboardUzenetForPopup(int felhasznaloId, int? gondviseloId, int popupId, string egyediAzonosito)
        {
            var parameters = new List<CommandParameter>()
            {
                new CommandParameter("pFelhasznaloId", felhasznaloId),
                new CommandParameter("pGondviseloId", gondviseloId ?? (object)DBNull.Value),
                new CommandParameter("pPopupId", popupId),
                new CommandParameter("pEgyediAzonosito", egyediAzonosito)
            };
            string gondviseloWhere = gondviseloId.HasValue ? " AND df.C_GONDVISELOID = :pGondviseloId" : " AND df.C_GONDVISELOID IS NULL";

            var commandText = $@"
            SELECT
                 df.ID
                ,d.C_EGYEDIAZONOSITO
                ,d.C_CIM
                ,d.C_TARTALOM
                ,d.C_DASHBOARDUZENETKATEGORIAID
                ,df.C_EGYEDIMUVELET
                ,df.C_MEGJELENITESEKSZAMA
                ,df.C_UTOLSOMEGTEKINTESIDEJE
            FROM
                T_DASHBOARDUZENETFELHASZNALO df
                INNER JOIN T_DASHBOARDUZENET d ON d.ID = df.C_DASHBOARDUZENETID
            WHERE
                df.TOROLT = 'F' AND d.TOROLT = 'F'
                AND d.C_ISPOPUP = 'T'
                AND df.C_FELHASZNALOID = @pFelhasznaloId {gondviseloWhere}
                AND df.ID = @pPopupId
                AND d.C_EGYEDIAZONOSITO = @pEgyediAzonosito
            ";

            return GetData(commandText, parameters);
        }

        public DataSet GetNextDashboardPopup(int felhasznaloId, int? gondviseloId, string[] displayedPopups)
        {
            var parameters = new List<CommandParameter>()
            {
                new CommandParameter("pFelhasznaloId", felhasznaloId),
                new CommandParameter("pGondviseloId", gondviseloId ?? (object)DBNull.Value, SDA.DataProvider.SDADBType.Int)
        };

            string gondviseloWhere = gondviseloId.HasValue ? " AND df.C_GONDVISELOID = :pGondviseloId" : " AND df.C_GONDVISELOID IS NULL";

            if (displayedPopups == null)
            {
                displayedPopups = new string[1] { "" };
            }
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < displayedPopups.Length; i++)
            {
                string name = string.Format("pPopup{0}", i);
                parameters.Add(new CommandParameter(name, displayedPopups[i]));
                sb.AppendFormat("@{0},", name);
            }

            var commandText = $@"
            SELECT TOP 1
                 df.ID
                ,d.C_EGYEDIAZONOSITO
            FROM
                T_DASHBOARDUZENETFELHASZNALO df
                INNER JOIN T_FELHASZNALO f ON f.ID = df.C_FELHASZNALOID
                INNER JOIN T_DASHBOARDUZENET d ON d.ID = df.C_DASHBOARDUZENETID
            WHERE
                df.TOROLT = 'F'
                AND d.TOROLT = 'F' AND d.C_ISPOPUP = 'T'
                AND df.C_MEGJELENITESEKSZAMA > 0
                AND d.C_EGYEDIAZONOSITO NOT IN ({sb.ToString().TrimEnd(',')})
                AND f.TOROLT = 'F'
                AND f.ID = :pFelhasznaloId {gondviseloWhere}
                AND (d.C_ERVENYESSEGKEZDETE IS NULL OR d.C_ERVENYESSEGKEZDETE < GETDATE())
                AND (d.C_ERVENYESSEGVEGE IS NULL OR d.C_ERVENYESSEGVEGE > GETDATE())
            ";

            return GetData(commandText, parameters);
        }

        public void UpdateDashboardPopupClose(int popupId)
        {
            var dufEntity = DashboardUzenetFelhasznalo.GiveAnInstance();
            dufEntity.LoadEntityByID(popupId);

            dufEntity.MegjelenitesekSzama--;
            dufEntity.UtolsoMegtekintesIdeje = DateTime.Now;
            dufEntity.Update();
            DalHelper.Commit();
        }

        public void UpdateDashboardPopupConfirm(int popupId)
        {
            var dufEntity = DashboardUzenetFelhasznalo.GiveAnInstance();
            dufEntity.LoadByID(popupId);

            dufEntity.MegjelenitesekSzama = 0;
            dufEntity.UtolsoMegtekintesIdeje = DateTime.Now;
            dufEntity.Update();
            DalHelper.Commit();
        }

        public string UpdateDashboardPopupNext(int popupId)
        {
            var dufEntity = DashboardUzenetFelhasznalo.GiveAnInstance();
            dufEntity.LoadByID(popupId);

            dufEntity.MegjelenitesekSzama = 0;
            dufEntity.UtolsoMegtekintesIdeje = DateTime.Now;
            dufEntity.Update();
            DalHelper.Commit();

            return dufEntity.EgyediMuvelet;
        }

        public DateTime GetKovTelepitesDatum()
        {
            var commandText = @"
                SELECT
                    ISNULL(C_ERVENYESSEGKEZDETE, GETDATE()) as Datum
                FROM T_DASHBOARDUZENET
                WHERE
                    C_EGYEDIAZONOSITO = 'LOGINRENDSZERERTESITES'
            ";

            return GetData(commandText).Tables[0].Rows[0].Field<DateTime>("Datum");
        }

        #endregion
    }
}