using Common.Constant;
using Database.Database;
using log4net;
using Microsoft.EntityFrameworkCore;

namespace SicboSub.Api.Business
{
    /// <summary>
    /// Implementation cho Authentication Service
    /// Xác thực token và lấy thông tin thuê bao từ database
    /// 
    /// Token được lưu trong bảng ACCOUNT_USER.TOKEN
    /// User truy cập website qua URL: https://...?token=xxx
    /// </summary>
    public class AuthServiceImpl : IAuthService
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(AuthServiceImpl));

        private readonly ModelContext dbContext;

        public AuthServiceImpl(ModelContext _dbContext)
        {
            dbContext = _dbContext;
        }

        /// <summary>
        /// Xác thực token và trả về thông tin user
        /// Token được so sánh với trường TOKEN trong bảng ACCOUNT_USER
        /// </summary>
        public async Task<AccountUser?> ValidateToken(string token)
        {
            if (string.IsNullOrEmpty(token))
            {
                log.Warn("ValidateToken: Token is null or empty");
                return null;
            }

            try
            {
                // Tìm user có token khớp
                var user = await dbContext.AccountUsers.AsNoTracking()
                    .FirstOrDefaultAsync(u => u.Token == token);

                if (user == null)
                {
                    log.Warn($"ValidateToken: Token not found in database");
                    return null;
                }

                // Check user status
                if (user.IsActive != 1)
                {
                    log.Warn($"ValidateToken: User {user.Msisdn} is not active");
                    return null;
                }

                if (user.IsLock == 1)
                {
                    log.Warn($"ValidateToken: User {user.Msisdn} is locked");
                    return null;
                }

                log.Debug($"ValidateToken: Token valid for MSISDN {user.Msisdn}");
                return user;
            }
            catch (Exception ex)
            {
                log.Error("ValidateToken exception: ", ex);
                return null;
            }
        }

        /// <summary>
        /// Lấy MSISDN từ token
        /// </summary>
        public async Task<string?> GetMsisdnFromToken(string token)
        {
            var user = await ValidateToken(token);
            return user?.Msisdn;
        }

        /// <summary>
        /// Validate token và trả về kết quả chi tiết với error code
        /// </summary>
        public async Task<TokenValidationResult> ValidateTokenWithDetails(string token)
        {
            var result = new TokenValidationResult();

            if (string.IsNullOrEmpty(token))
            {
                result.IsValid = false;
                result.ErrorCode = CommonErrorCode.TokenInvalid;
                result.ErrorMessage = "Token is required";
                return result;
            }

            try
            {
                // Tìm user có token khớp
                var user = await dbContext.AccountUsers.AsNoTracking()
                    .FirstOrDefaultAsync(u => u.Token == token);

                if (user == null)
                {
                    result.IsValid = false;
                    result.ErrorCode = CommonErrorCode.TokenInvalid;
                    result.ErrorMessage = "Token không hợp lệ hoặc đã hết hạn";
                    log.Warn($"ValidateTokenWithDetails: Token not found");
                    return result;
                }

                // Check user is active
                if (user.IsActive != 1)
                {
                    result.IsValid = false;
                    result.ErrorCode = CommonErrorCode.AccountDisabled;
                    result.ErrorMessage = "Tài khoản đã bị vô hiệu hóa";
                    log.Warn($"ValidateTokenWithDetails: User {user.Msisdn} is not active");
                    return result;
                }

                // Check user is locked
                if (user.IsLock == 1)
                {
                    result.IsValid = false;
                    result.ErrorCode = CommonErrorCode.AccountLocked;
                    result.ErrorMessage = "Tài khoản đã bị khóa";
                    log.Warn($"ValidateTokenWithDetails: User {user.Msisdn} is locked");
                    return result;
                }

                // Token is valid
                result.IsValid = true;
                result.Msisdn = user.Msisdn;
                result.User = user;
                log.Debug($"ValidateTokenWithDetails: Token valid for MSISDN {user.Msisdn}");

                return result;
            }
            catch (Exception ex)
            {
                log.Error("ValidateTokenWithDetails exception: ", ex);
                result.IsValid = false;
                result.ErrorCode = CommonErrorCode.SystemError;
                result.ErrorMessage = "Lỗi hệ thống khi xác thực token";
                return result;
            }
        }
    }
}
