using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Xml.Serialization;
using Kreta.DataAccess.Interfaces;
using Kreta.DataAccessManual.Interfaces;
using Kreta.DataAccessManual.Model;
using Kreta.DataAccessManual.Util;
using Kreta.Framework;
using Kreta.Framework.Util;
using SDA.DataProvider;
using SDA.Kreta.Entities;

namespace Kreta.DataAccessManual
{
    internal class CsengetesiRendOrakDal : DataAccessBase, ICsengetesiRendOrakDal
    {
        public CsengetesiRendOrakDal(DalHandler handler, GridParameters parameters) : base(handler, parameters)
        {

        }

        public CsengetesiRendOrakDal(DalHandler handler) : base(handler)
        {

        }

        public void UpdateCsengetesiRend(int? newCsengetesiRendId, int? oldCsengetesiRendId)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandText = "uspUpdateCsengetesiRend";
                command.Parameters.Add("newCsengetesiRendId", newCsengetesiRendId);
                command.Parameters.Add("oldCsengetesiRendId", oldCsengetesiRendId);
                command.CommandType = CommandType.StoredProcedure;

                command.ExecuteNonQuery();
                DalHelper.Commit();
            }
        }

        public DataSet GetCsengetesiiRendKapcsolodoOra(int csengetesiRendId, int tanevId, int intezmenyId)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "uspGetCsengetesiiRendKapcsolodoOra";

                command.Parameters.Add("pCsengetesiRendId", csengetesiRendId);
                command.Parameters.Add("pTanevId", tanevId);
                command.Parameters.Add("pIntezmenyId", intezmenyId);

                var dataSet = new DataSet();
                using (var sdaDataAdapter = new SDADataAdapter())
                {
                    sdaDataAdapter.SelectCommand = command;
                    sdaDataAdapter.Fill(dataSet);
                }

                return dataSet;
            }
        }

        public DataSet GetCsengetesiiRendKapcsolodoOraKezdeteVege(int csengetesiRendId, int tanevId)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "uspGetCsengetesiiRendKapcsolodoOraKezdeteVege";

                command.Parameters.Add("pTanevId", tanevId);
                command.Parameters.Add("pCsengetesiRendId", csengetesiRendId);

                var dataSet = new DataSet();
                using (var sdaDataAdapter = new SDADataAdapter())
                {
                    sdaDataAdapter.SelectCommand = command;
                    sdaDataAdapter.Fill(dataSet);
                }

                return dataSet;
            }
        }

        public DataSet GetCsengetesiRendOraiForGrid(int csengetesiRendId, bool onlyReal)
        {
            var parameters = new List<CommandParameter>() { new CommandParameter("pCsengetesiRendID", csengetesiRendId) };

            var commandText = @"
                      SELECT
                        Oraszam AS ID,
                        ID AS CsengetesiRendOraId,
                        Kezdete,
                        Vege,
                        Oraszam,
                        CsengrendId,
                        CASE
                         WHEN ID is null
                            THEN 'F'
                         ELSE  'T'
                        END AS IsReal
                      FROM (( SELECT DISTINCT number AS Oraszam
                              FROM master..[spt_values]
                              WHERE number BETWEEN 0 AND 49 ) AS mask
                            LEFT JOIN (SELECT
                                           [ID] ID
                                          ,left(cast(C_KEZDETE as time),5) Kezdete
                                          ,left(cast(c_VEGE as time),5) Vege
                                          ,[C_ORASZAM] RealOraszam
                                          ,[C_CSENGETESIRENDID] CsengrendId
                                         FROM [T_CSENGETESIRENDORA_OSSZES]
                                         WHERE [TOROLT] ='F'
                                         AND [C_CSENGETESIRENDID] = :pCsengetesiRendID ) data ON mask.Oraszam = data.RealOraszam)
                    ";

            if (onlyReal)
            {
                commandText += "WHERE ID IS NOT NULL";
            }

            DataSet ds = GetData(commandText, parameters, booleanColumns: "IsReal");

            return ds;
        }

        public DataSet GetCsengetesiOrakKezdVeg(int tanevId, int intezmenyId)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "uspGetCsengetesiOrakKezdVeg";

                command.Parameters.Add("pTanevId", tanevId);
                command.Parameters.Add("pIntezmenyId", intezmenyId);

                var dataSet = new DataSet();
                using (var sdaDataAdapter = new SDADataAdapter())
                {
                    sdaDataAdapter.SelectCommand = command;
                    sdaDataAdapter.Fill(dataSet);
                }

                return dataSet;
            }
        }

        public DataSet GetCsengetesirendOrakNaptarhoz(int tanevId, int? csengetesiRendId)
        {
            var parameters = new List<CommandParameter>();
            string whereClause = "";
            parameters.Add(new CommandParameter("pTanevId", tanevId));

            if (csengetesiRendId.HasValue)
            {
                parameters.Add(new CommandParameter("pCsengetesiRendId", csengetesiRendId));
                whereClause += " AND T_CSENGETESIREND_OSSZES.ID = :pCsengetesiRendId";
            }
            else
            {
                whereClause += " AND T_CSENGETESIREND_OSSZES.C_AKTIV = 'T'";
            }

            var commandText = @"
                    SELECT
                         T_CSENGETESIRENDORA_OSSZES.ID
                      ,T_CSENGETESIRENDORA_OSSZES.C_KEZDETE
                      ,T_CSENGETESIRENDORA_OSSZES.C_VEGE
                      ,T_CSENGETESIRENDORA_OSSZES.C_ORASZAM
                    FROM
                        T_CSENGETESIRENDORA_OSSZES
                    INNER JOIN
                        T_CSENGETESIREND_OSSZES ON
                            T_CSENGETESIREND_OSSZES.ID = T_CSENGETESIRENDORA_OSSZES.C_CSENGETESIRENDID
                    WHERE
                            T_CSENGETESIRENDORA_OSSZES.TOROLT = 'F'
                        AND T_CSENGETESIRENDORA_OSSZES.C_TANEVID = :pTanevId"
                        + whereClause;

            DataSet ds = GetData(commandText, parameters);
            return ds;
        }

        public int CsengetesiRendOrakTorles(List<int> torlendok, int tanevId)
        {
            var torlendokXml = new CsengetesiRendOraTorlesXml();
            foreach (var id in torlendok)
            {
                torlendokXml.Ids.Add(id);
            }

            string xml;
            var serializer = new XmlSerializer(typeof(CsengetesiRendOraTorlesXml));
            using (var stream = new StringWriter())
            {
                serializer.Serialize(stream, torlendokXml);
                xml = stream.ToString();
            }

            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.Add("xml", xml);
                command.Parameters.Add("TanevId", tanevId);
                command.CommandText = @"sp_CsengetesiRendOrakTorles";

                var result = command.ExecuteScalar();
                int id;

                DalHelper.Commit();

                if (result != null && int.TryParse(result.ToString(), out id))
                {
                    return id;
                }

                return 0;
            }
        }

        public int Delete(int id)
        {
            var entity = CsengetesiRendOra.GiveAnInstance();
            entity.LoadByID(id);

            entity.Delete(true);
            DalHelper.Commit();

            return entity.CsengetesiRendId;
        }

        public ICsengetesiRendOra Get()
        {
            return CsengetesiRendOra.GiveAnInstance();
        }

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

        public void Insert(ICsengetesiRendOra dto)
        {
            var entity = dto as CsengetesiRendOra;
            entity.Insert();

            dto.ID = entity.ID;
            DalHelper.Commit();
        }

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

        public void UpdateOrarendiOraVisszamenolegesen(int csengetesiRendOraId)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandText = "sp_UpdateOrarendiOraVisszamenolegesen";
                command.Parameters.Add("csengetesiRendOraId", csengetesiRendOraId);
                command.CommandType = CommandType.StoredProcedure;

                command.ExecuteNonQuery();
                DalHelper.Commit();
            }
        }

        public int? GetCsengetesiRendOraIdByIdAndOraszam(int csengRendId, int oraszam, int tanevId)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "uspGetCsengetesiRendOraIdByIdAndOraszam";

                command.Parameters.Add("pcsengRendId", csengRendId);
                command.Parameters.Add("poraszam", oraszam);
                command.Parameters.Add("pTanevId", tanevId);

                var result = command.ExecuteScalar();
                if (result != null)
                {
                    if (int.TryParse(result.ToString(), out var intres))
                    {
                        return intres;
                    }
                }

                return null;
            }
        }

        public DataSet CheckOrarendiOraOraszamIdopont(int intezmenyId, int tanevId, int csengetesiRendId, int oraszam)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "uspCheckOrarendiOraOraszamIdopont";

                command.Parameters.Add("pIntezmenyId", intezmenyId);
                command.Parameters.Add("pTanevId", tanevId);
                command.Parameters.Add("pCsengetesiRendId", csengetesiRendId);
                command.Parameters.Add("pOraszam", oraszam);

                var dataSet = new DataSet();
                using (var sdaDataAdapter = new SDADataAdapter())
                {
                    sdaDataAdapter.SelectCommand = command;
                    sdaDataAdapter.Fill(dataSet);
                }

                return dataSet;
            }
        }

        public DataSet ReferencesCount(int csengetesiRendOraId, int tanevId)
        {
            using (var command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "uspReferencesCount";

                command.Parameters.Add("pTanevId", tanevId);
                command.Parameters.Add("pCsengetesiRendOraId", csengetesiRendOraId);

                var dataSet = new DataSet();
                using (var sdaDataAdapter = new SDADataAdapter())
                {
                    sdaDataAdapter.SelectCommand = command;
                    sdaDataAdapter.Fill(dataSet);
                }

                return dataSet;
            }
        }

        public void FollowUpCsengetesiRendOra(int intezmenyId, int aktTanevId, int kovetkezoTanevId, int csnegetesiRendOraId, int csengetesiRendId, bool isVisszamenoleges)
        {
            using (SDACommand command = new SDACommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.CommandText = "uspFollowUpcsengetesiRendOra";
                command.Parameters.Add("intezmenyId", intezmenyId);
                command.Parameters.Add("aktTanevId", aktTanevId);
                command.Parameters.Add("kovetkezoTanevId", kovetkezoTanevId);
                command.Parameters.Add("csengetesiRendOraId", csnegetesiRendOraId);
                command.Parameters.Add("csengetesiRendId", csengetesiRendId);
                command.Parameters.Add("isVisszamenoleges", isVisszamenoleges);
                command.CommandType = CommandType.StoredProcedure;
                command.ExecuteNonQuery();
                DalHelper.Commit();
            }
        }

    }
}