using MTWorkHR.Core.Entities;
using MTWorkHR.Core.IRepositories.Base;
using MTWorkHR.Core.UnitOfWork;
using MTWorkHR.Infrastructure.Data;
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 UnitOfWorkLog(HRDataContext _context
            , IRepositoryLog<UserLog> userLog
            , IRepositoryLog<AuthLog> authenticateLog
            , IRepositoryLog<FileLog> FileLog
            , IRepositoryLog<RoleLog> RoleLog
            , IRepositoryLog<SettingLog> settingLog
            )
        {
            context = _context;

            UserLog = userLog;
            AuthLog = authenticateLog;
            this.FileLog = FileLog;
            this.RoleLog = RoleLog;
            this.SettingLog = settingLog;
		}

        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;
        }


    }
}