using AutoMapper;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
using HRM.BO;
using HRM.BO.Basic;
using HRM.DA;
using HRM.DA.Service;
using HRM.DA.Service.ess;
using HRM.DA.Service.SearchTools;
using HRM.DA.Service.Tax;
using Payroll.Service;
using Payroll.BO;
using HRM.DA.Fund;
using HRM.DA.Service.Basic;
using HRM.Service;
using static HRM.BO.RecJobTracking;
using static HRM.BO.EmployeeTaxException;

namespace HRM.UI.Configuration.DI
{
    /// <summary>
    /// 
    /// </summary>
    public static class ServiceCollectionExtensions
    {
#pragma warning disable IDE0060 // Remove unused parameter
        /// <summary>
        /// 
        /// </summary>
        /// <param name="services"></param>
        /// <param name="configuration"></param>
        public static void ConfigureBusinessServices(this IServiceCollection services, IConfiguration configuration)
#pragma warning restore IDE0060 // Remove unused parameter
        {
            if (services != null)
            {
                services.AddTransient<IRoleService, RoleService>();
                services.AddTransient<IUserRoleService, UserRoleService>();
                services.AddTransient<IUserService, UserService>();
                services.AddTransient<IPasswordHistoryService, PasswordHistoryService>();
                services.AddTransient<ISearchEmployeeService, SearchEmployeeService>();
                services.AddTransient<IHREmployeeService, HREmployeeService>();
                services.AddTransient<ILeaveService, LeaveService>();
                services.AddTransient<ILeaveEntryService, LeaveEntryService>();
                services.AddTransient<IMaternityLeaveService, MaternityLeaveService>();
                services.AddTransient<IEmployeeService, EmployeeService>();
                services.AddTransient<IADParameterService, ADParameterService>();
                services.AddTransient<IADParameterEmployeeService, ADParameterEmployeeService>();
                services.AddTransient<IApproveFinantialDataService, ApproveFinantialDataService>();
                services.AddTransient<IPayrollTypeService, PayrollTypeService>();
                services.AddTransient<IUserAccessTypeService, UserAccessTypeService>();
                services.AddTransient<IBookmarkService, BookmarkService>();
                services.AddTransient<IReminderService, ReminderService>();

                services.AddTransient<IEmployeeStatusService, EmployeeStatusService>();
                services.AddTransient<IAllowanceDeductionService, AllowanceDeductionService>();
                services.AddTransient<IBonusService, BonusService>();
                services.AddTransient<ICategoryService, CategoryService>();
                services.AddTransient<IDepartmentService, DepartmentService>();
                services.AddTransient<IDesignationService, DesignationService>();
                services.AddTransient<IGradeService, GradeService>();
                services.AddTransient<IGradeSegmentService, GradeSegmentService>();
                services.AddTransient<ILocationService, LocationService>();
                services.AddTransient<IEmployeeOverTimeService, EmployeeOverTimeService>();
                services.AddTransient<ITermService, TermService>();
                services.AddTransient<IOccupationService, OccupationService>();
                services.AddTransient<IEducationLevelService, EducationLevelService>();
                services.AddTransient<ITrainingTypeService, TrainingTypeService>();
                services.AddTransient<IEducationTypeService, EducationTypeService>();
                services.AddTransient<INominationPurposeService, NominationPurposeService>();
                services.AddTransient<ISalaryComponent, SalaryComponentService>();
                services.AddTransient<INationalityService, NationalityService>();


                services.AddTransient<IEmpLifeCycleService, EmpLifeCycleService>();
                services.AddTransient<IEmployeeGradeSalaryService, EmployeeGradeSalaryService>();
                services.AddTransient<IEmployeeStatusService, EmployeeStatusService>();
                services.AddTransient<IEmployeeBankAccountService, EmployeeBankAccountService>();
                services.AddTransient<IEmployeeCostCenterService, EmployeeCostCenterService>();
                services.AddTransient<ITermParameterService, TermParameterService>();
                services.AddTransient<IOTProcessService, OTProcessService>();
                services.AddTransient<IBonusParameterService, BonusParameterService>();
                services.AddTransient<IBonusProcessService, BonusProcessService>();
                services.AddTransient<ILoanEmployeeDocService, LoanEmployeeDocService>();
                services.AddTransient<ILoanIssueService, LoanIssueService>();
                services.AddTransient<ILoanParameterService, LoanParameterService>();
                services.AddTransient<ILoanScheduleService, LoanScheduleService>();
                services.AddTransient<IAdvanceIncomeTaxService, AdvanceIncomeTaxService>();
                services.AddTransient<IEmployeeTaxInvestmentService, EmployeeTaxInvestmentService>();
                services.AddTransient<IIncomeTaxService, IncomeTaxService>();
                services.AddTransient<IITEmpHeadService, ITEmpHeadService>();
                services.AddTransient<IMinTaxExceptionService, MinTaxExceptionService>();
                services.AddTransient<ITaxAdjustmentService, TaxAdjustmentService>();
                services.AddTransient<ITaxChallanService, TaxChallanService>();
                services.AddTransient<ITaxHeadAssignmentService, TaxHeadAssignmentService>();
                services.AddTransient<ITaxInvestmentService, TaxInvestmentService>();
                services.AddTransient<ITaxMergeMasterService, TaxMergeMasterService>();
                services.AddTransient<ITaxParameterService, TaxParameterService>();
                services.AddTransient<ISalaryMonthlyService, SalaryMonthlyService>();
                services.AddTransient<ISalaryProcessService, SalaryProcessService>();
                services.AddTransient<IEmployeeUnAuthorizeLeaveService, EmployeeUnAuthorizeLeaveService>();
                services.AddTransient<IUnAuthorizeLeaveService, UnAuthorizeLeaveService>();
                services.AddTransient<IUnAuthorizeLeaveParamService, UnAuthorizeLeaveParamService>();
                services.AddTransient<IJVSetupService, JVSetupService>();
                services.AddTransient<IJVSetupCCService, JVSetupCCService>();
                services.AddTransient<IJVSetupDetailService, JVSetupDetailService>();
                services.AddTransient<IJVTypeService, JVTypeService>();
                services.AddTransient<IOGPositionTypeService, OGPositionTypeService>();
                services.AddTransient<IOrganogramService, OrganogramService>();
                services.AddTransient<IOrganogramEmployeeService, OrganogramEmployeeService>();
                services.AddTransient<ISkillService, SkillService>();
                services.AddTransient<ISkillLevelService, SkillLevelService>();
                services.AddTransient<IOpiParameterService, OpiParameterService>();
                services.AddTransient<IOpiParameterIndividualService, OpiParameterIndividualService>();
                services.AddTransient<IOPIPaymentService, OPIPaymentService>();
                services.AddTransient<IOPIProcessService, OPIProcessService>();
                services.AddTransient<IOpiItemService, OpiItemService>();
                services.AddTransient<IFSHeadService, FSHeadService>();
                services.AddTransient<IFSTranService, FSTranService>();
                services.AddTransient<IFSTranDetailService, FSTranDetailService>();
                services.AddTransient<IDelegateResponsibilityService, DelegateResponsibilityService>();
                services.AddTransient<IWFMovementTranService, WFMovementTranService>();
                services.AddTransient<IWFSetupService, WFSetupService>();
                services.AddTransient<IWFTypeService, WFTypeService>();
                services.AddTransient<IWFRuleService, WFRuleService>();
                services.AddTransient<IPayrollPaymentComponent, payrollPaymentComponentService>();
                
                services.AddTransient<IEmployeeShortLeaveService, EmployeeShortLeaveService>();
                services.AddTransient<ILeaveService, LeaveService>();
                services.AddTransient<ILeaveEntryService, LeaveEntryService>();
                services.AddTransient<ILeaveExceptionService, LeaveExceptionService>();
                services.AddTransient<ILeaveParameterService, LeaveParameterService>();
                services.AddTransient<ILeavePlanService, LeavePlanService>();
                services.AddTransient<ILeaveProcessService, LeaveProcessService>();
                services.AddTransient<ILeaveYearService, LeaveYearService>();
                services.AddTransient<ILeaveEncashmentService, LeaveEncashmentService>();
                services.AddTransient<IUploadEncashAmountService, UploadEncashAmountService>();
                services.AddTransient<IShortLeaveService, ShortLeaveService>();

                services.AddTransient<IBankService, BankService>();
                services.AddTransient<IBranchService, BranchService>();
                services.AddTransient<ICostcenterService, CostcenterService>();
                services.AddTransient<ILoanService, LoanService>();
                services.AddTransient<ILoanEmployeeDocService, LoanEmployeeDocService>();
                services.AddTransient<ILoanIssueService, LoanIssueService>();
                services.AddTransient<ILoanParameterService, LoanParameterService>();
                services.AddTransient<ILoanScheduleService, LoanScheduleService>();

                services.AddTransient<IEmpLifeCycleService, EmpLifeCycleService>();
                services.AddTransient<IProcessItemService, ProcessItemService>();
                services.AddTransient<IHolidayCalendarService, HolidayCalendarService>();
                services.AddTransient<IWeeklyHolidayService, WeeklyHolidayService>();
                services.AddTransient<IAttnNationalHolidayService, AttnNationalHolidayService>();
                services.AddTransient<IWorkPlanGroupService, WorkPlanGroupService>();
                services.AddTransient<IEmployeeWorkPlanSetupService, EmployeeWorkPlanSetupService>();
                services.AddTransient<IShiftRotationService, ShiftRotationService>();
                services.AddTransient<IDailyAttnProcessService, DailyAttnProcessService>();
                services.AddTransient<IAttnRawDataService, AttnRawDataService>();
                services.AddTransient<IEmployeeOutsideDutyService, EmployeeOutsideDutyService>();
                services.AddTransient<IMonthlyWorkPlanService, MonthlyWorkPlanService>();
                services.AddTransient<IActingResponsibilitySetupService, ActingResponsibilitySetupService>();
                services.AddTransient<IFSTranService, FSTranService>();
                services.AddTransient<IFSTranDetailService, FSTranDetailService>();
                services.AddTransient<IAccessCardTypeService, AccessCardTypeService>();

                //services.AddTransient<IRateService, RateService>();
                //services.AddTransient<IRemitterService, RemitterService>();
                //services.AddTransient<IFranchiseService, FranchiseService>();
                //services.AddTransient<IRemittanceService, RemittanceService>();
                //services.AddTransient<IComplainService, ComplainService>();

                services.AddTransient<IAdvanceIncomeTaxService, AdvanceIncomeTaxService>();
                services.AddTransient<IEmployeeTaxInvestmentService, EmployeeTaxInvestmentService>();
                services.AddTransient<IIncomeTaxService, IncomeTaxService>();
                services.AddTransient<IITEmpHeadService, ITEmpHeadService>();
                services.AddTransient<IMinTaxExceptionService, MinTaxExceptionService>();
                services.AddTransient<ITaxAdjustmentService, TaxAdjustmentService>();
                services.AddTransient<ITaxChallanService, TaxChallanService>();
                services.AddTransient<ITaxHeadAssignmentService, TaxHeadAssignmentService>();
                services.AddTransient<ITaxInvestmentService, TaxInvestmentService>();
                services.AddTransient<ITaxMergeMasterService, TaxMergeMasterService>();
                services.AddTransient<ITaxParameterService, TaxParameterService>();
                services.AddTransient<ICountryService, CountryService>();
                services.AddTransient<INatureOfTrainingService, NatureOfTrainingService>();
                services.AddTransient<IInstitutionService, InstitutionService>();
                services.AddTransient<IRelationService, RelationService>();
                services.AddTransient<IDistrictService, DistrictService>();
                services.AddTransient<IThanaService, ThanaService>();
                services.AddTransient<IResultTypeService, ResultTypeService>();
                services.AddTransient<IDisciplineService, DisciplineService>();
                services.AddTransient<IReligionService, ReligionService>();
              
                services.AddTransient<ISystemConfigaration, SystemConfigarationService>();

                // shift
                
                services.AddTransient<IAccessCardService, AccessCardService>();
                services.AddTransient<ICardOperationService, CardOperationService>();
                services.AddTransient<IShiftService, ShiftService>();

                //profile Update Request
                services.AddTransient<IProfileUpdateRequestService, ProfileUpdateRequestService>();

                // PMP
                services.AddTransient<IPMPProcessService, PMPProcessService>();
                services.AddTransient<IObjectiveTypeService, ObjectiveTypeService>();
                services.AddTransient<IObjectiveCategoryGradesService, ObjectiveCategoryGradesService>();
                services.AddTransient<IObjectiveCategoryService, ObjectiveCategoryService>();
                services.AddTransient<IObjectiveService, ObjectiveService>();
                services.AddTransient<IObjectiveSetService, ObjectiveSetService>();
                services.AddTransient<IObjectiveSetRemarksService, ObjectiveSetRemarksService>();
                services.AddTransient<IAssesmentValueDetailsService, AssesmentValueDetailsService>();
                services.AddTransient<IAppraisalPointRatingService, AppraisalPointRatingService>();
                services.AddTransient<IEmpAppraisalRatingService, EmpAppraisalRatingService>();
                services.AddTransient<IEmployeeAppraisalService, EmployeeAppraisalService>();
                services.AddTransient<IAppraisalPointService, AppraisalPointService>();
                services.AddTransient<IYearEndValuesRatingService, YearEndValuesRatingService>();
                services.AddTransient<IDevelopmentPlanService, DevelopmentPlanService>();
                services.AddTransient<ICompetencyService, CompetencyService>();
                services.AddTransient<IQuestionnaireService, QuestionnaireService>();
                services.AddTransient<IPMPValueBehaviorService, PMPValueBehaviorService>();
                services.AddTransient<IPMPValueBehaviorSettingService, PMPValueBehaviorSettingService>();
                services.AddTransient<ISuccessionRoleService, SuccessionRoleService>();
                services.AddTransient<ISuccessionPlanningService, SuccessionPlanningService>();
                services.AddTransient<IPMPRatingService, PMPRatingService>();
                services.AddTransient<IPMSObjectiveProgressService, PMSObjectiveProgressService>();
                services.AddTransient<IPMSObjectiveProgressAttachmentService, PMSObjectiveProgressAttachmentService>();

                //Search-toolsF
                services.AddTransient<IDbColumnsService, DbColumnService>();
                services.AddTransient<IQueryToolService, QueryToolService>();

                // Job Definition
                services.AddTransient<IJobDefinitionService, JobDefinitionService>();

                // Requirements
                services.AddTransient<IRecruitmentRequisitionService, RecruitmentRequisitionService>();
                services.AddTransient<ICVService, CVService>();
                services.AddTransient<IHeadCountApprovalRequestService, HeadCountApprovalRequestService>();
                services.AddTransient<IInternalRecruitmentService, InternalRecruitmentService>();
                services.AddTransient<ICandidateService, CandidateService>();
                services.AddTransient<IRecruitementProcessService, RecruitementProcessService>();
                services.AddTransient<IRecruitmentLettersService, RecruitmentLettersService>();

                services.AddTransient<IDataUploadColumnDefinition, DataUploadColumnDefinationService>();

                services.AddTransient<ITrainingService, TrainingService>();
                services.AddTransient<ITrainingScheduleService, TrainingScheduleService>();
                services.AddTransient<ILetterRequestService, LetterRequestService>();

                // for mobile service
                services.AddTransient<IMOBILEAppVersionService, MOBILEAppVersionService>();
                services.AddTransient<IEmpMobileService, EmpMobileService>();
                services.AddTransient<IPhotoPathService, PhotoPathService>();
                services.AddTransient<ISystemInformationService, SystemInformationService>();
                services.AddTransient<IEmpFieldTrackService, EmpFieldTrackService>();

                services.AddTransient<IAssetService, AssetService>();
                services.AddTransient<IVendorService, VendorService>();
                services.AddTransient<IStoreService, StoreService>();
                services.AddTransient<IAssetSerialService, AssetSerialService>();
                services.AddTransient<IAssetCategoryService, AssetCategoryService>();
                services.AddTransient<IAssetSerialTranService, AssetSerialTranService>();
                services.AddTransient<IClaimBasicService, ClaimBasicService>();
                services.AddTransient<IClaimBasicItemService, ClaimBasicItemService>();
                services.AddTransient<IClaimRuleService, ClaimRuleService>();
                services.AddTransient<IClaimRequisitionService, ClaimRequisitionService>();
                services.AddTransient<IAuthorizedPersonService, AuthorizedPersonService>();
                services.AddTransient<IFSHeadService, FSHeadService>();
                services.AddTransient<IResignationRequestService, ResignationRequestService>();
                services.AddTransient<ITaxReturnService, TaxReturnService>();
                services.AddTransient<IEmpTaxAitService, EmpTaxAitService>();
                services.AddTransient<IPayrollComponentListService, PayrollComponentListService>();
                services.AddTransient<IOrganizationService, OrganizationService>();
                services.AddTransient<IFinalSettlementService, FinalSettlementService>();
                services.AddTransient<ISettlementClearanceService, SettlementClearanceService>();
                services.AddTransient<ISettlementAdvanceService, SettlmentAdviceService>();
                services.AddTransient<IClaimDisbursementService, ClaimDisbursementService>();

                services.AddTransient<IReminderService, ReminderService>();
                services.AddTransient<IErCircularService, ErCircularService>();
                services.AddTransient<IErCircularDetailService, ErCircularDetailService>();
                services.AddTransient<IAssetItService, AssetItService>();
                services.AddTransient<IOutsideDutyService, OutsideDutyService>();
                services.AddTransient<IComplainService, ComplainService>();
                services.AddTransient<IPunishmentService, PunishmentService>();
                services.AddTransient<IDAMasterService, DAMasterService>();
                services.AddTransient<IProfileDashboardMobile, ProfileDashboardMobileService>();
                services.AddTransient<IAttnMobileRawDataService, AttnMobileRawDataService>();
                services.AddTransient<IClaimBalaceService, ClaimBalanceService>();

                services.AddTransient<IHrNotificationService, HrNotificationService>();
                services.AddTransient<IQuestionCategoryService, QuestionCategoryService>();
                services.AddTransient<IQuestionService, QuestionService>();
                services.AddTransient<IQuestionAnswerService, QuestionAnswerService>();
                services.AddTransient<ISurveyCategoryService, SurveyCategoryService>();
                services.AddTransient<ISurveyService, SurveyService>();
                services.AddTransient<ISurveyQuestionService, SurveyQuestionService>();
                services.AddTransient<IErAppliedApplicantService, ErAppliedApplicantService>();
                services.AddTransient<IErCVService, ErCVService>();

                //Production Bonus
                services.AddTransient<IProdBonusAttnService, ProdBonusAttnService>();
                services.AddTransient<IProdBonusLineService, ProdBonusLineService>();
                services.AddTransient<IProdBonusParameterService, ProdBonusParameterService>();
                services.AddTransient<IProdBonusProcessService, ProdBonusProcessService>();
                services.AddTransient<IProdBonusSupervisorService, ProdBonusSupervisorService>();
                services.AddTransient<IProdBonusWorkScheduleService, ProdBonusWorkScheduleService>();
                services.AddTransient<IProductionBonusSetupService, ProductionBonusSetupService>();
                services.AddTransient<IDataPermissionService, DataPermissionService>();
                services.AddTransient<IPRBCalculationService, PRBCalculationService>();
                services.AddTransient<IPRBKpiService, PRBKpiService>();
                services.AddTransient<IRecJobTrackingService, RecJobTrackingService>();
                services.AddTransient<IDataIntergrationRequestService, DataIntergrationRequestService>();
                services.AddTransient<IApiIntegrationService, ApiIntegrationService>();
                services.AddTransient<IMemberService, MemberService>();
                services.AddTransient<IMembersTransactionDetailsService, MembersTransactionDetailsService>();
                services.AddTransient<IEmployeeTaxExcecptionService, EmployeeTaxExceptionService>();

                // services.AddTransient<IDataIntergrationRequestService, DataIntergrationRequestService>();

            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="services"></param>
        public static void ConfigureMappings(this IServiceCollection services)
        {
            if (services != null)
            {
                //Automap settings

                services.AddAutoMapper(Assembly.GetExecutingAssembly());
            }
        }
    }
}