using Ease.Core.Model;


using System;
using System.Collections.Generic;
using System.Data;
namespace HRM.BO
{
    public class Recognition : BasicBaseObject//, IworkflowInterface
    {

        #region Constructor
        public Recognition()
        {
            _nominateBy = (0);
            _nominateDate = DateTime.MinValue;
            _justification = string.Empty;
            _isCash = false;
            _salaryMonth = DateTime.MinValue;
            _eWfStatus = EnumwfStatus.Received;
            _eRequestType = EnumRequestType.Recognition;

        }
        #endregion


        #region Public Properties

        #region NominateBy : ID
        private int _nominateBy;
        public int NominateBy
        {
            get { return _nominateBy; }
            set { _nominateBy = value; }
        }
        #endregion

        public Employee Employee { get; set; }

        //private Employee _employee;
        //public Employee Employee
        //{
        //    get
        //    {
        //        if (_employee == null && _nominateBy != null)
        //        {
        //            //_employee = new Employee();                    
        //            _employee = Employee.Get(_nominateBy);
        //        }
        //        return _employee;
        //    }
        //    set
        //    {
        //        _employee = value;
        //    }
        //}

        #region NominateDate : Datetime
        private DateTime _nominateDate;
        public DateTime NominateDate
        {
            get { return _nominateDate; }
            set
            {
                _nominateDate = value;
            }
        }
        #endregion

        #region Justification : string
        private string _justification;
        public string Justification
        {
            get { return _justification; }
            set { _justification = value; }
        }
        #endregion

        #region IsCash : bool
        private bool _isCash;
        public bool IsCash
        {
            get { return _isCash; }
            set { _isCash = value; }
        }
        #endregion

        #region SalaryMonth : DateTime
        private DateTime _salaryMonth;
        public DateTime SalaryMonth
        {
            get { return _salaryMonth; }
            set { _salaryMonth = value; }
        }
        #endregion

        #region WfStatus : enumwfStatus
        private EnumwfStatus _eWfStatus;
        public EnumwfStatus WfStatus
        {
            get { return _eWfStatus; }
            set { _eWfStatus = value; }
        }
        #endregion

        #region RequestType: EnumRequestType
        private EnumRequestType _eRequestType;
        public EnumRequestType RequestType
        {
            get { return _eRequestType; }
            set { _eRequestType = value; }
        }
        #endregion

        public List<RecognitionDetail> RecognitionDetails { get; set; }

        //#region RecognitionDetail
        //private List<RecognitionDetail> _recognitionDetails;
        //public List<RecognitionDetail> RecognitionDetails
        //{
        //    get
        //    {
        //        if (this.int != null && _recognitionDetails == null)
        //        {
        //            _recognitionDetails = Recognition.Service.GetRecognitionDetails(this.ID);
        //        }
        //        return _recognitionDetails;
        //    }
        //    set { _recognitionDetails = value; }
        //}
        //#endregion

        //#region Service Factory
        //internal static IRecognitionService Service
        //{
        //    get { return Services.Factory.CreateService<IRecognitionService>(typeof(IRecognitionService)); }
        //}
        //#endregion

        #endregion
        //#region IworkflowInterface Members
        ////this property is used for work flow
        //public int GetStatusbyWf(enumwfStatus wfstatus)
        //{
        //    return (int)this.WfStatus;
        //}
        //public string WFDesciption()
        //{
        //    return this.ObjectDescription;
        //}
        //public string ObjectDescription
        //{
        //    get
        //    {
        //        string empName = string.Empty;
        //        string tableBody = string.Empty;
        //        string str = string.Empty;
        //        int count = 1;
        //        List<RecognitionDetail> recognitionDetails = this.RecognitionDetails;
        //        List<Employee> employee = Employee.Get();
        //        int gradeID = employee.Where(e => e.ID.Integer == this.NominateBy.Integer).Select(e => e.GradeID).FirstOrDefault().Integer;
        //        recognitionDetails.ForEach(r => empName = empName + (employee.Where(e => e.ID.Integer == r.EmployeeID.Integer).Select(e => e.Name).FirstOrDefault()) + ", ");
        //        recognitionDetails.ForEach(r => tableBody = tableBody + "<tr>" + "<td align='left' style='border:0.5px solid;'>" + count++ + "</td>" + "<td align='left' style='border:0.5px solid;'>" + employee.Where(e => e.ID.Integer == r.EmployeeID.Integer).Select(e => e.Name).FirstOrDefault() + "</td>" + "<td align='right' style='border:0.5px solid;'>" + r.Amount.ToString("#,###") + "</td>" + "</tr>");

        //        string tableNominatedEmp = "<table style='border:1px solid; border-collapse: collapse;'>" +
        //                                    "<thead style='background-color: #ffb113;'>" +
        //                                    "<tr>" +
        //                                    "<th style='border:0.5px solid;'>SI</th>" +
        //                                    "<th style='border:0.5px solid;'>Nominated Employee</th>" +
        //                                    "<th style='border:0.5px solid;'>Amount</th>" +
        //                                    "</tr>" +
        //                                    "</thead>" +
        //                                    "<tbody>" +
        //                                    tableBody +
        //                                    "<tr style='background-color: #ffb113;'>" +
        //                                    "<td></td><td>Grand Total</td><td align='right'>" + recognitionDetails.Sum(r => r.Amount).ToString("#,###") + "</td>" +
        //                                    "</tr>" +
        //                                    "</tbody>" +
        //                                    "</table><br/><br/>";
        //        if (this.WfStatus == enumwfStatus.Passed && gradeID != 15 || gradeID != 18 || gradeID != 19 || gradeID != 20 || gradeID != 23)
        //            str = "  " + this.Employee.Name + " has nominated the following persons for YES Tier 1 recognition.<br/><br/>" + tableNominatedEmp;
        //        else
        //            str = "  " + "Your YES Tier 1 recognition for the following persons has been approved.<br/><br/>" + tableNominatedEmp;

        //        return str;
        //    }
        //}

        ////this property is used for work flow
        //public int SetupID
        //{
        //    get
        //    {
        //        return (3);
        //    }
        //}
        ////this property is used for work flow
        //public int ObjectID
        //{
        //    get { return this.ID; }
        //}

        //public List<PendingJobDetail> GetDetails()
        //{
        //    List<PendingJobDetail> opJobsDetail = new List<PendingJobDetail>();

        //    opJobsDetail.Add(new PendingJobDetail() { Type = "Applier:", Value = this.Employee.Name });
        //    opJobsDetail.Add(new PendingJobDetail() { Type = "Salary Month:", Value = this.SalaryMonth.ToString("MMM yyyy") });
        //    opJobsDetail.Add(new PendingJobDetail() { Type = "Justification:", Value = this.Justification });
        //    opJobsDetail.Add(new PendingJobDetail() { Type = "Cash :", Value = this.IsCash ? "Yes" : "No" });
        //    opJobsDetail.Add(new PendingJobDetail() { Type = "Nomination Date :", Value = this.NominateDate.ToString("dd MMM yyyy") });

        //    // add more items as per need
        //    return opJobsDetail;
        //}

        //#endregion

        //#region Public Methods
        //public static Recognition Get(int iD)
        //{
        //    return Recognition.Service.Get(iD);
        //}
        //public static List<Recognition> Get()
        //{
        //    return Recognition.Service.Get();
        //}
        //public int Save()
        //{
        //    this.SetAuditTrailProperties();
        //    return Recognition.Service.Save(this);
        //}
        //public void Delete(int iD)
        //{
        //    Recognition.Service.Delete(iD);
        //}
        //public static List<RecognitionDetail> GetRecognitionDetails(int recognitionID)
        //{
        //    return Recognition.Service.GetRecognitionDetails(recognitionID);
        //}
        //public static List<RecognitionDetail> GetHRRequetByWFStatus(enumwfStatus enumwfStatus, DateTime fromDate, DateTime toDate, bool p)
        //{
        //    return Recognition.Service.GetRecognitionDetails(enumwfStatus, fromDate, toDate, p);
        //}

        //public static void UpdatePaidDate(List<RecognitionDetail> request, List<RecognitionDetail> Uncheckedrequest)
        //{
        //    Recognition.Service.UpdatePaidDate(request, Uncheckedrequest);
        //}
        //#endregion



    }
    public class RecognitionDetail : BasicBaseObject
    {
        #region Constructor
        public RecognitionDetail()
        {
            _recognitionID = (0);
            _employeeID = (0);
            _amount = 0.0;
            _salaryMonth = DateTime.MinValue;
            _paidDate = DateTime.MinValue;
        }
        #endregion
        #region Properties

        #region RecognitionID : ID
        private int _recognitionID;
        public int RecognitionID
        {
            get { return _recognitionID; }
            set { _recognitionID = value; }
        }
        #endregion

        #region EmployeeID : ID
        private int _employeeID;
        public int EmployeeID
        {
            get { return _employeeID; }
            set { _employeeID = value; }
        }
        #endregion

        #region Amount : double
        private double _amount;
        public double Amount
        {
            get { return _amount; }
            set { _amount = value; }
        }
        #endregion
        #region SalaryMonth : DateTime
        private DateTime _salaryMonth;
        public DateTime SalaryMonth
        {
            get { return _salaryMonth; }
            set { _salaryMonth = value; }
        }
        #endregion
        #region PaidDate : DateTime
        private DateTime _paidDate;
        public DateTime PaidDate
        {
            get { return _paidDate; }
            set { _paidDate = value; }
        }
        #endregion

        #endregion

        public DateTime RequestDate { get; set; }


    }

    public interface IRecognitionService
    {
        Recognition Get(int iD);
        List<Recognition> Get();
        int Save(Recognition recognition);
        void Delete(int iD);
        List<RecognitionDetail> GetRecognitionDetails(int recognitionID);

        List<RecognitionDetail> GetRecognitionDetails(EnumwfStatus enumwfStatus, DateTime fromDate, DateTime toDate, bool p);

        void UpdatePaidDate(List<RecognitionDetail> request, List<RecognitionDetail> Uncheckedrequest);
    }
}