using OnlineSalesAutoCrop.CoreAPI.Models.Objects.Setups;
using OnlineSalesAutoCrop.CoreAPI.Models.Objects.Systems;
using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Common;
using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Integrations;
using OnlineSalesAutoCrop.CoreAPI.Models.Requests.MobileApp;
using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Systems;
using OnlineSalesAutoCrop.CoreAPI.Models.Responses.MobileApp;
using OnlineSalesAutoCrop.CoreAPI.Models.Responses.Systems;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace OnlineSalesAutoCrop.CoreAPI.Services.Contracts.Systems
{
	public interface IUserService
	{
		Task<bool> ValidateAuthValueAsync(string authValue, int userId);
		Task<User> LoginAsync(LoginRequest request, string ipAddress, bool checkPwd);
		Task<AppAuthUserResponse> LoginAsync(MobileAppAuthRequest request, string ipAddress);
		Task<User> IntegrationLoginAsync(IntegrationLoginRequest request, string ipAddress, bool checkPwd);

        Task<bool> LogoutAsync(string ipAddress, int userId, int logId, bool attendanceLogout, string loginId, string localIp, string macAddress, string hostName, string logoutRemarks);

		Task<AuthLogoutResponse> LogoutAsync(AuthLogoutRequest request, string ipAddress);
		Task<AppChangePasswordResponse> ChangePasswordAsync(AppUserChangePasswordRequest request, string ipAddress);

		Task<bool> DeleteUserAsync(int userId, int deletedBy);
		Task<bool> ForceLogoutNowAsync(List<int> userIds, string ipAddress);
		Task<bool> UnlockUserAsync(int userId, string loginId, int unlockedBy);
		Task<bool> DeleteAttributesAsync(int userId, int clientType, int deletedBy);
		Task<bool> EditUserAsync(UserRequest user, string ipAddress, int modifiedBy);
		Task<bool> AddUserAsync(NewUserRequest user, string ipAddress, int createdBy);
		Task<bool> UpdateMyInfoAsync(string address, string contactNo, int modifiedBy, int emplyeeId);
		Task<bool> ResetPasswordAsync(int userId, string newPassword, string ipAddress, int changedBy);
		Task<bool> UpdateMyThemeAsync(int userId, string menuLayout, string themeName, string schemeName);
		Task<bool> SaveAuthorizeLimitAsync(decimal maxAuthLimit, int userId, string ipAddress, string savedBy);
		Task<bool> UploadDocumentAsync(int userId, int id, int documentOf, string orgFileName, string fileName);
		Task<bool> ChangePasswordAsync(int userId, string oldPassword, string newPassword, string ipAddress, int changedBy);
		Task<bool> SaveAttributesAsync(int userId, int clientType, string ipAddress, int attributeSetBy, List<string> ukIds);

		Task<UserGetResponse> GetUserAsync(int userId);
		Task<MenuResponse> GetUserPermissionsAsync(int userId);
		Task<UserProfileResponse> GetUserProfileAsync(int userId);
		Task<FindAccountResponse> FindAccountAsync(string accountId);
		Task<UserAuthorizeLimitResponse> GetAuthorizeLimitAsync(int userId);
		Task<UserAttributesResponse> GetAttributesAsync(int userId, int clientType);

		Task<int> LoadNotificationCountAsync(int userId);
	
		Task<UserBasicInfoResponse> GetAttendanceUsersAsync(int userId);
	
		Task<UserForceLogoutResponse> GetForceLogoutUsersAsync(int createdBy);
		Task<bool> SendPasswordAsync(int userId, string newPassword, string ipAddress);
		Task<UserBasicInfoResponse> GetUsersByTeamSpaceAsync(string teamSpaceIds, int projectId, int userId);
		Task<UserBasicInfoResponse> GetUsersBasicAsync(bool applyFilter, string teamSpaceIds, int projectId);
		Task<AccessLogResponse> GetAccessLogAsync(int accessType, string loginId, DateTime startDate, DateTime endDate);
	}
}

