using MTWorkHR.Core.Entities;
using MTWorkHR.Core.IRepositories;
using MTWorkHR.Core.IRepositories.Base;


namespace MTWorkHR.Core.UnitOfWork
{
    public interface IUnitOfWork
    {
        IPermissionRepository Permission { get; }
        IProjectRepository Project { get; }
        IProjectTeamRepository ProjectTeam { get; }

        IUserTaskRepository UserTask { get; }
        IUserTaskAttachmentRepository UserTaskAttachment { get; }
        ITaskStatusRepository UserTaskStatus { get; }
        IUserTaskHistoryRepository UserTaskHistory { get; }
        ICompanyRepository Company { get; }
        ITeamUserRepository TeamUser{ get; }
        ITeamRepository Team { get; }
        IMeetingRepository Meeting{ get; }
        IMeetingUserRepository MeetingUser { get; }

        IAttendanceRepository Attendance { get; }
        IOrderTypeRepository OrderType { get; }
        IOrderRequestRepository OrderRequest { get; }
        IOrderAllocationRepository OrderAllocation { get; }
        ILeaveTypeRepository LeaveType{ get; }
        ICountryLookupRepository CountryLookup { get; }
        IIndustryRepository Industry { get; }
        IJobTitleRepository JobTitle { get; }
        IUniversityRepository University { get; }
        ICityRepository City{ get; }
        IQualificationRepository Qualification { get; }
        ILoginOTPRepository LoginOTP { get; }

        IChatMessageRepository ChatMessage { get; }
        IContractRepository Contract { get; }
        IHubConnectionRepository HubConnection { get; }

        Task<int> CompleteAsync();

        void BeginTran();

        void CommitTran();

        void RollbackTran();

        object GetRepositoryByName(string name);
    }
}