using HRM.BO;
using Ease.Core.DataAccess;
using System;
using System.Data;


namespace HRM.DA
{
    #region OpiParameterDA

    public class OpiParameterDA
    {
        #region Constructor

        public OpiParameterDA()
        {
        }

        #endregion

        #region Insert function

        internal static void Insert(TransactionContext tc, OpiParameter oItem)
        {
            tc.ExecuteNonQuery("INSERT INTO OpiParameter("
                               + " OpiParameterID, OpiType, AmountToDistribute, AvgMonth, "
                               + " ProvisionAmount, FlatAmount, GFFlatAmount, GFPercentOfBasic, GFPercentOfGross, FromDate, ToDate, Gender, Status, "
                               + " IsActive, IsEarnedBasic, IsTaxable, OpiItemID, "
                               + " OpiPeriodicity, PercentOfBasic, PercentOfGross, MinAmount, "
                               + " MaxAmount, IsConfirmed, IsFractionate, IsWithException,IsIAApplicable, "
                               + " EntitleType, OpiAvgPayType, OpiAvgPayItemID, NoOfMonth, "
                               + " CreatedBy, CreationDate,PayrollTypeID)" +
                               " VALUES(%n, %n, %n, %n, "
                               + " %n, %n, %n, %n, %n, %d, %d, %n, %n, "
                               + " %b, %b, %b, %n, "
                               + " %n, %n, %n, %n, "
                               + " %n, %b, %b, %b,%b, "
                               + " %n, %n, %n, %n, "
                               + " %n, %d,%n)",
                oItem.ID, oItem.OpiType, oItem.AmountToDistribute, oItem.AvgMonth,
                oItem.ProvisionAmount, oItem.FlatAmount, oItem.GFFlatAmount, oItem.GFPercentOfBasic,
                oItem.GFPercentOfGross, DataReader.GetNullValue(oItem.FromDate), DataReader.GetNullValue(oItem.ToDate),
                oItem.Gender, oItem.Status,
                oItem.IsActive, oItem.IsEarnedBasic, oItem.IsTaxable, oItem.OpiItemID,
                oItem.OpiPeriodicity, oItem.PercentOfBasic, oItem.PercentOfGross,
                DataReader.GetNullValue(oItem.MinAmount),
                DataReader.GetNullValue(oItem.MaxAmount), oItem.IsConfirmed, oItem.IsFractionate, oItem.IsWithException,
                oItem.IsIAApplicable,
                oItem.EntitleType, oItem.OpiAvgPayType, DataReader.GetNullValue(oItem.OpiAvgPayItemID), oItem.NoOfMonth,
                oItem.CreatedBy, oItem.CreatedDate, oItem.PayrollTypeID);
        }

        internal static void InsertGrade(TransactionContext tc, OpiParameterGrade oItem)
        {
            tc.ExecuteNonQuery("INSERT INTO OpiParameterGrade("
                               + " OPIPARAMETERGradeID, GradeID, OpiParameterID, OpiItemId, "
                               + " CreatedBy, CreationDate,PayrollTypeID)"
                               + " VALUES(%n, %n, %n, %n, "
                               + " %n, %d,%n)",
                oItem.ID, oItem.GradeId, oItem.OpiParameterId, oItem.OpiItemId,
                DataReader.GetNullValue(oItem.CreatedBy), DataReader.GetNullValue(oItem.CreatedDate),
                oItem.PayrollTypeID);
        }

        #endregion

        #region Update function

        internal static void Update(TransactionContext tc, OpiParameter oItem)
        {
            tc.ExecuteNonQuery("UPDATE OpiParameter SET "
                               + " OpiType=%n, AmountToDistribute=%n, AvgMonth=%n, ProvisionAmount=%n, FlatAmount=%n, GFFlatAmount=%n, GFPercentOfBasic=%n, GFPercentOfGross=%n, "
                               + " FromDate=%d, ToDate=%d, Gender=%n, Status=%n, IsActive=%b, "
                               + " IsEarnedBasic=%b, IsTaxable=%b, OpiItemID=%n, OpiPeriodicity=%n, "
                               + " PercentOfBasic=%n, PercentOfGross=%n, MinAmount=%n, MaxAmount=%n, "
                               + " IsConfirmed=%b, IsFractionate=%b, IsWithException=%n,IsIAApplicable=%b, EntitleType=%n, "
                               + " OpiAvgPayType=%n, OpiAvgPayItemID=%n, NoOfMonth=%n, "
                               + " ModifiedBy=%n, ModifiedDate=%d WHERE OpiParameterID=%n AND PayrollTypeID=%n",
                oItem.OpiType, oItem.AmountToDistribute, oItem.AvgMonth, oItem.ProvisionAmount, oItem.FlatAmount,
                oItem.GFFlatAmount, oItem.GFPercentOfBasic, oItem.GFPercentOfGross,
                DataReader.GetNullValue(oItem.FromDate), DataReader.GetNullValue(oItem.ToDate), oItem.Gender,
                oItem.Status, oItem.IsActive,
                oItem.IsEarnedBasic, oItem.IsTaxable, oItem.OpiItemID, oItem.OpiPeriodicity,
                oItem.PercentOfBasic, oItem.PercentOfGross, oItem.MinAmount, oItem.MaxAmount,
                oItem.IsConfirmed, oItem.IsWithException, oItem.IsFractionate, oItem.IsIAApplicable, oItem.EntitleType,
                oItem.OpiAvgPayType, DataReader.GetNullValue(oItem.OpiAvgPayItemID), oItem.NoOfMonth,
                oItem.ModifiedBy, oItem.ModifiedDate, oItem.ID, oItem.PayrollTypeID);
        }

        #endregion

        #region Get Function

        internal static IDataReader Get(TransactionContext tc, int payrollTypeID)
        {
            return tc.ExecuteReader("SELECT * FROM OpiParameter where PayrollTypeID=%n", payrollTypeID);
        }

        internal static IDataReader Get(TransactionContext tc, int nID, int payrollTypeID)
        {
            return tc.ExecuteReader("SELECT * FROM OpiParameter WHERE OpiParameterID =%n AND PayrollTypeID=%n", nID,
                payrollTypeID);
        }

        internal static IDataReader GetGrades(TransactionContext tc, int nOpiParameterID, int payrollTypeID)
        {
            return tc.ExecuteReader("Select * from OpiParameterGrade Where OpiParameterID= %n AND PayrollTypeID=%n",
                nOpiParameterID, payrollTypeID);
        }

        internal static IDataReader Get(TransactionContext tc, EnumStatus status, int payrollTypeID)
        {
            //return tc.ExecuteReader("SELECT * FROM OpiParameter WHERE Status= %n", status);
            if (status == EnumStatus.Regardless)
                return tc.ExecuteReader("SELECT * FROM OpiParameter Where PayrollTypeID=%n", payrollTypeID);
            else
                return tc.ExecuteReader(
                    "SELECT OpiParameter.* FROM OpiParameter, OpiItem Where OpiItem.OpiItemID=OpiParameter.OpiItemID AND OpiParameter.Status=%n AND OpiParameter.PayrollTypeID=%n",
                    status, payrollTypeID);
        }

        internal static IDataReader Get(TransactionContext tc, EnumStatus status, EnumOpiType nType, int payrollTypeID)
        {
            if (status == EnumStatus.Regardless)
                return tc.ExecuteReader(
                    "SELECT * FROM OpiParameter WHERE OpiType = %n AND PayrollTypeID=%n Order By OpiPeriodicity", nType,
                    payrollTypeID);
            else
                return tc.ExecuteReader(
                    "SELECT * FROM OpiParameter WHERE  OpiType = %n AND Status=%n AND PayrollTypeID=%n Order By OpiPeriodicity",
                    nType, status, payrollTypeID);
            //return tc.ExecuteReader("SELECT OpiParameter.* FROM OpiParameter, OpiItem Where OpiItem.OpiItemID=OpiParameter.OpiItemID AND OpiParameter.Status=%n", status);
        }

        internal static IDataReader Get(TransactionContext tc, EnumStatus enumStatus, EnumOpiType enumOpiType,
            EnumEntitleType enumEntitleType, int payrollTypeID)
        {
            if (enumStatus == EnumStatus.Regardless)
                return tc.ExecuteReader(
                    "SELECT * FROM OpiParameter WHERE OpiType = %n AND PayrollTypeID=%n AND EntitleType=%n Order By OpiPeriodicity",
                    enumOpiType, payrollTypeID, enumEntitleType);
            else
                return tc.ExecuteReader(
                    "SELECT * FROM OpiParameter WHERE  OpiType = %n AND Status=%n AND PayrollTypeID=%n AND EntitleType=%n Order By OpiPeriodicity",
                    enumOpiType, enumStatus, payrollTypeID, enumEntitleType);
            //return tc.ExecuteReader("SELECT OpiParameter.* FROM OpiParameter, OpiItem Where OpiItem.OpiItemID=OpiParameter.OpiItemID AND OpiParameter.Status=%n", status);
        }
        internal static IDataReader GetUsedGrades(TransactionContext tc, int opiItemid)
        {
            return tc.ExecuteReader(@"select *from OpiParameterGrade where OpiParameterID in (
select  OpiParameterID from OpiParameter where OpiItemID = %n)", opiItemid);
        }

        internal static IDataReader Get(TransactionContext tc, EnumStatus enumStatus, EnumEntitleType enumEntitleType,
            int payrollTypeID)
        {
            if (enumStatus == EnumStatus.Regardless)
                return tc.ExecuteReader(
                    "SELECT * FROM OpiParameter WHERE PayrollTypeID=%n AND EntitleType=%n Order By OpiPeriodicity",
                    payrollTypeID, enumEntitleType);
            else
                return tc.ExecuteReader(
                    "SELECT * FROM OpiParameter WHERE Status=%n AND PayrollTypeID=%n AND EntitleType=%n Order By OpiPeriodicity",
                    enumStatus, payrollTypeID, enumEntitleType);
            //return tc.ExecuteReader("SELECT OpiParameter.* FROM OpiParameter, OpiItem Where OpiItem.OpiItemID=OpiParameter.OpiItemID AND OpiParameter.Status=%n", status);
        }
        internal static void ChangeStatus(TransactionContext tc, int id, EnumStatus enumStatus)
        {
            string sql = string.Empty;
            bool IsCurrentlyActive = (enumStatus == EnumStatus.Active) ? true : false;

            sql = SQLParser.MakeSQL(@"UPDATE OpiParameter 
                                      SET 
                                      IsActive=%b,
                                      STATUS=%n 
                                      Where OpiParameterID=%n", IsCurrentlyActive, (int)enumStatus, id);

            tc.ExecuteNonQuery(sql);
        }
        #endregion

        #region Delete function

        internal static void Delete(TransactionContext tc, int nID)
        {
            tc.ExecuteNonQuery("DELETE FROM OpiParameterGrade WHERE OpiParameterID=%n ", nID);
            tc.ExecuteNonQuery("DELETE FROM OpiParameterIndividual WHERE OpiParameterID=%n ", nID);
            tc.ExecuteNonQuery("DELETE FROM OpiParameter WHERE OpiParameterID=%n ", nID);
        }

        internal static void DeleteGrades(TransactionContext tc, int nOpiParameterID)
        {
            tc.ExecuteNonQuery("DELETE FROM OpiParameterGrade WHERE OpiParameterID=%n ",
                nOpiParameterID);
        }

        #endregion

        internal static IDataReader GetGrades(TransactionContext tc, int payrollTypeID)
        {
            string sql = SQLParser.MakeSQL(@"Select * from OpiParameterGrade Where PayrollTypeID=%n", payrollTypeID);
            return tc.ExecuteReader(sql);
        }
    }

    #endregion
}