Utils/ValidationHelperUtil.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using ChatworkBulkSender.Utils;

namespace ChatworkBulkSender.Utils
{
    /// <summary>
    /// バリデーション処理の共通定義静的クラス
    /// </summary>
    public static class ValidationHelperUtil
    {
        /// <summary>
        /// APIトークンの形式をチェック
        /// </summary>
        /// <param name="apiToken">APIトークン</param>
        /// <returns>有効な形式の場合true</returns>
        public static bool IsValidApiToken(string apiToken)
        {
            if (string.IsNullOrEmpty(apiToken))
                return false;

            // 英小文字と数字の組み合わせ(1~100文字)
            return Regex.IsMatch(apiToken, Constants.API_TOKEN_PATTERN);
        }

        /// <summary>
        /// ルームIDの形式をチェック
        /// </summary>
        /// <param name="roomId">ルームID</param>
        /// <returns>有効な形式の場合true</returns>
        public static bool IsValidRoomId(string roomId)
        {
            if (string.IsNullOrEmpty(roomId))
                return false;

            // 1〜10桁の数値
            return Regex.IsMatch(roomId, Constants.ROOM_ID_PATTERN);
        }

        /// <summary>
        /// アカウントIDの形式をチェック
        /// </summary>
        /// <param name="accountId">アカウントID</param>
        /// <returns>有効な形式の場合true</returns>
        public static bool IsValidAccountId(string accountId)
        {
            if (string.IsNullOrEmpty(accountId))
                return false;

            // 1〜10桁の数値
            return Regex.IsMatch(accountId, Constants.ACCOUNT_ID_PATTERN);
        }

        /// <summary>
        /// 文字数チェック用のエラーメッセージを生成
        /// </summary>
        /// <param name="fieldName">フィールド名</param>
        /// <param name="currentLength">現在の文字数</param>
        /// <param name="maxLength">最大文字数</param>
        /// <returns>エラーメッセージ</returns>
        public static string GetLengthErrorMessage(string fieldName, int currentLength, int maxLength)
        {
            return $"{fieldName}は{maxLength}文字以内で入力してください。(現在:{currentLength}文字)";
        }

        /// <summary>
        /// APIトークンの形式エラーメッセージを取得
        /// </summary>
        /// <returns>エラーメッセージ</returns>
        public static string GetApiTokenFormatErrorMessage()
        {
            return "APIトークンは32文字の16進数(0-9, a-f)で入力してください。";
        }

        /// <summary>
        /// ルームIDの形式エラーメッセージを取得
        /// </summary>
        /// <param name="fieldName">フィールド名(「ルームID」または「テストルームID」など)</param>
        /// <returns>エラーメッセージ</returns>
        public static string GetRoomIdFormatErrorMessage(string fieldName)
        {
            return $"{fieldName}は20桁以内の数値で入力してください。";
        }

        /// <summary>
        /// アカウントIDの形式エラーメッセージを取得
        /// </summary>
        /// <param name="fieldName">フィールド名(「宛先アカウントID」など)</param>
        /// <returns>エラーメッセージ</returns>
        public static string GetAccountIdFormatErrorMessage(string fieldName)
        {
            return $"{fieldName}は20桁以内の数値で入力してください。";
        }

        /// <summary>
        /// カンマ区切りのアカウントIDリストを検証
        /// </summary>
        /// <param name="accountIds">カンマ区切りのアカウントID</param>
        /// <param name="invalidIds">無効なIDのリスト(出力)</param>
        /// <returns>すべて有効な場合true</returns>
        public static bool ValidateAccountIdList(string accountIds, out string[] invalidIds)
        {
            invalidIds = null;

            if (string.IsNullOrWhiteSpace(accountIds))
                return true; // 空の場合は有効とする

            var ids = accountIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            var invalidList = new System.Collections.Generic.List<string>();

            foreach (var id in ids)
            {
                var trimmedId = id.Trim();
                if (!IsValidAccountId(trimmedId))
                {
                    invalidList.Add(trimmedId);
                }
            }

            if (invalidList.Count > 0)
            {
                invalidIds = invalidList.ToArray();
                return false;
            }

            return true;
        }

        /// <summary>
        /// 管理番号の形式をチェック
        /// </summary>
        /// <param name="managementNumber">管理番号</param>
        /// <returns>有効な形式の場合true</returns>
        public static bool IsValidManagementNumber(string managementNumber)
        {
            if (string.IsNullOrEmpty(managementNumber))
                return false;

            // 数値のみ(1以上の整数)
            if (int.TryParse(managementNumber, out int number))
            {
                return number > 0;
            }
            return false;
        }

        /// <summary>
        /// 管理番号のエラーメッセージを取得
        /// </summary>
        /// <returns>エラーメッセージ</returns>
        public static string GetManagementNumberFormatErrorMessage()
        {
            return "管理番号は1以上の半角数字で入力してください。";
        }

        /// <summary>
        /// 並び順の形式をチェック
        /// </summary>
        /// <param name="sortOrder">並び順</param>
        /// <returns>有効な形式の場合true</returns>
        public static bool IsValidSortOrder(string sortOrder)
        {
            if (string.IsNullOrEmpty(sortOrder))
                return false;

            // 数値のみ(1以上の整数)
            if (int.TryParse(sortOrder, out int number))
            {
                return number > 0;
            }
            return false;
        }

        /// <summary>
        /// 並び順のエラーメッセージを取得
        /// </summary>
        /// <returns>エラーメッセージ</returns>
        public static string GetSortOrderFormatErrorMessage()
        {
            return "並び順は1以上の半角数字で入力してください。";
        }
    }
}