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

namespace HRM.DA
{
    internal class DepartmentDA
    {
        private DepartmentDA()
        {
        }

        #region Insert function

        internal static void Insert(TransactionContext tc, Department item)
        {
            tc.ExecuteNonQuery(
                "INSERT INTO Department(DepartmentID, code, description, parentID, parentsID, CreatedBy, CreationDate, SequenceNo, Status,TIRE, CostCenter,PayrollTypeID)" +
                " VALUES(%n, %s, %s, %n, %s, %n, %d, %n, %n,%n, %s,%n)", item.ID, item.Code, item.Name, item.ParentID,
                item.ParentsID, item.CreatedBy,
                item.CreatedDate, item.Sequence, item.Status, item.Tier, item.CostCenter, item.PayrollTypeID);
        }

        #endregion

        #region Update function

        internal static void Update(TransactionContext tc, Department item)
        {
            string sql = string.Empty;
            sql = SQLParser.MakeSQL(
                @"UPDATE Department SET code=%s, description=%s, parentID=%n, parentsID=%s, ModifiedBy=%n, ModifiedDate=%d, SequenceNo=%n, Status=%n,TIRE=%n, CostCenter=%s
             WHERE DepartmentID=%n", item.Code, item.Name, item.ParentID, item.ParentsID, item.ModifiedBy,
                item.ModifiedDate, item.Sequence, item.Status, item.Tier, item.CostCenter, item.ID);
            tc.ExecuteNonQuery(sql);
        }

        internal static void UpdateCode(TransactionContext tc, Department item, string sCode)
        {
            string sSQL = SQLParser.MakeSQL("UPDATE Department Set code = %s Where DepartmentID = %n", sCode, item.ID);
            tc.ExecuteNonQuery(sSQL);
        }

        internal static void UpdateCostCenter(TransactionContext tc, Department item)
        {
            string sSQL = SQLParser.MakeSQL("UPDATE Department Set CostCenter = %s Where DepartmentID = %n",
                item.CostCenter.Trim(), item.ID);
            tc.ExecuteNonQuery(sSQL);
        }

        #endregion

        #region GetFunction

        internal static IDataReader GetParent(TransactionContext tc, EnumStatus status, int payrollTypeID)
        {
            if (EnumStatus.Active == status || EnumStatus.Inactive == status)
            {
                string sql =
                    SQLParser.MakeSQL(
                        "SELECT * FROM Department Where parentid is null and Status=%n  Order By DESCRIPTION", status,
                        payrollTypeID);
                return tc.ExecuteReader(sql);
            }
            else
            {
                return tc.ExecuteReader("SELECT * FROM Department Where parentid is null Order By DESCRIPTION",
                    payrollTypeID);
            }
        }

        internal static IDataReader Get(TransactionContext tc, EnumStatus status, int payrollTypeID)
        {
            if (EnumStatus.Active == status || EnumStatus.Inactive == status)
            {
                return tc.ExecuteReader(
                    @"SELECT d.* FROM Department d where  d.status=%n and d.PayrollTypeID=%n order by d.Description",
                    status, payrollTypeID);
            }
            else
            {
                return tc.ExecuteReader(
                    @"SELECT d.* FROM Department d Where d.PayrollTypeID=%n  order by d.Description", payrollTypeID);
            }
        }

        internal static IDataReader GetAllDepartment(TransactionContext tc, int payrollTypeID, EnumStatus status,
            string code, string name)
        {
            string sqlClause = string.Empty;
            sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("PayrollTypeID = %n", payrollTypeID);
            if (EnumStatus.Active == status || EnumStatus.Inactive == status)
            {
                sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("status = %n", status);
            }

            if (!string.IsNullOrWhiteSpace(code))
            {
                sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("Code = %s", code);
            }

            if (!string.IsNullOrWhiteSpace(name))
            {
                sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("Name LIKE %s", ("%" + name + "%"));
            }

            return tc.ExecuteReader("SELECT * FROM Department %q order by Description", sqlClause);
        }

        internal static IDataReader Get(TransactionContext tc, int ID)
        {
            return tc.ExecuteReader("SELECT * FROM Department WHERE DepartmentID=%n", ID);
        }
        
        internal static IDataReader GetByDeptIds(TransactionContext tc, string deptIds)
        {
            return tc.ExecuteReader("SELECT * FROM Department where departmentId IN (%q)", deptIds);
        }

        internal static IDataReader GetAll(TransactionContext tc)
        {
            return tc.ExecuteReader("SELECT * FROM Department");
        }

        #endregion

        internal static void Delete(TransactionContext tc, int ID)
        {
            tc.ExecuteNonQuery("DELETE FROM Department WHERE DepartmentID=%n", ID);
        }
    }
}