namespace bitforum.Services
{
    public interface IConfigService
    {
        // 회원가입 차단 확인
        public bool IsRegisterBlock();

        // 회원가입 시 이메일 인증
        public bool IsRegisterEmailAuth();

        // 회원가입 거부 목록 확인
        public bool IsDeniedEmail(string email);

        // 비밀번호 정책 확인
        public bool IsPasswordPolicyValid(string password);

        // 회원가입 시 이메일 인증
    }

    public class ConfigService: IConfigService
    {
        public ConfigService()
        {

        }

        public bool IsRegisterBlock()
        {
            return Config.Register.IsRegisterBlock == 'Y';
        }

        public bool IsRegisterEmailAuth()
        {
            return Config.Register.IsRegisterEmailAuth == 'Y';
        }

        public bool IsDeniedEmail(string email)
        {
            var deniedEmailList = Config.Register.DeniedEmailList;

            if (string.IsNullOrWhiteSpace(deniedEmailList))
            {
                return false;
            }

            return deniedEmailList.Split(',', StringSplitOptions.RemoveEmptyEntries).Any(deniedEmail => string.Equals(deniedEmail.Trim(), email, StringComparison.OrdinalIgnoreCase));
        }

        public bool IsPasswordPolicyValid(string password)
        {
            // 설정값 가져오기
            var minLengthConfig = Config.Register.PasswordMinLength;
            var uppercaseLengthConfig = Config.Register.PasswordUppercaseLength;
            var numbersLengthConfig = Config.Register.PasswordNumbersLength;
            var specialCharsLengthConfig = Config.Register.PasswordSpecialcharsLength;

            // 각 설정값을 기본값으로 초기화 (null일 경우 대체값 사용)
            int minLength = minLengthConfig ?? 6; // 최소 6자
            int minUppercase = uppercaseLengthConfig ?? 0;
            int minNumbers = numbersLengthConfig ?? 0;
            int minSpecialChars = specialCharsLengthConfig ?? 0;

            // 비밀번호 길이 확인
            if (password.Length < minLength)
            {
                return false;
            }

            // 대문자 개수 확인
            int uppercaseCount = password.Count(char.IsUpper);
            if (uppercaseCount < minUppercase)
            {
                return false;
            }

            // 숫자 개수 확인
            int numberCount = password.Count(char.IsDigit);
            if (numberCount < minNumbers)
            {
                return false;
            }

            // 특수문자 개수 확인
            int specialCharCount = password.Count(ch => !char.IsLetterOrDigit(ch));
            if (specialCharCount < minSpecialChars)
            {
                return false;
            }

            return true;
        }
    }
}
