using MTWorkHR.Core.Entities;
using MTWorkHR.Core.IRepositories.Base;
using MTWorkHR.Core.UnitOfWork;
using MTWorkHR.Infrastructure.DBContext;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace MTWorkHR.Infrastructure.UnitOfWorks
{
    public class UnitOfWorkLog : IUnitOfWorkLog
    {
        private readonly HRDataContext context;
        public IRepositoryLog<UserLog> UserLog { get; }
        public IRepositoryLog<AuthLog> AuthLog { get; }
        public IRepositoryLog<FileLog> FileLog { get; }
        public IRepositoryLog<RoleLog> RoleLog { get; }
        public IRepositoryLog<SettingLog> SettingLog { get; }
        public IRepositoryLog<UserTaskLog> UserTaskLog { get; }
        public IRepositoryLog<TeamLog> TeamLog { get; }
        public IRepositoryLog<MeetingLog> MeetingLog { get; }
        public IRepositoryLog<AttendanceLog> AttendanceLog { get; }


        public UnitOfWorkLog(HRDataContext _context
            , IRepositoryLog<UserLog> userLog
            , IRepositoryLog<AuthLog> authenticateLog
            , IRepositoryLog<FileLog> FileLog
            , IRepositoryLog<RoleLog> RoleLog
            , IRepositoryLog<SettingLog> settingLog
            , IRepositoryLog<UserTaskLog> userTaskLog
            , IRepositoryLog<TeamLog> teamLog
            , IRepositoryLog<MeetingLog> meetingLog
            , IRepositoryLog<AttendanceLog> attendanceLog
            )
        {
            context = _context;

            UserLog = userLog;
            AuthLog = authenticateLog;
            this.FileLog = FileLog;
            this.RoleLog = RoleLog;
            this.SettingLog = settingLog;
            this.UserTaskLog = userTaskLog;
            this.TeamLog = teamLog;
            this.MeetingLog = meetingLog;
            this.AttendanceLog = attendanceLog;
		}

        public async Task<int> CompleteAsync()
        {
            return await context.SaveChangesAsync();
        }

        public object GetRepositoryByName(string name)
        {
            Type type = this.GetType();
            PropertyInfo info = type.GetProperty(name);
            if (info == null)
                throw new Exception(String.Format(
                  "A property called {0} can't be accessed for type {1}.",
                  name, type.FullName));

            var value = info.GetValue(this, null);

            // value = Convert.ChangeType(value, type);

            return value;
        }


    }
}