using System;
using System.Collections.Generic;
using YachtDice.Dice;

namespace YachtDice.Categories
{
    /// <summary>
    /// Статические хелперы для проверки комбинаций дайсов.
    /// Перенесены из CategoryScorer для переиспользования в конкретных SO-категориях.
    /// </summary>
    public static class DiceCheckUtility
    {
        /// <summary>Извлекает массив значений из абстрактных дайсов.</summary>
        public static int[] ExtractValues(IReadOnlyList<IDie> dice)
        {
            int[] values = new int[dice.Count];
            for (int i = 0; i < dice.Count; i++)
                values[i] = dice[i].Value;
            return values;
        }

        /// <summary>Сумма дайсов, показывающих конкретное значение.</summary>
        public static int SumOfValue(int[] values, int target)
        {
            int sum = 0;
            for (int i = 0; i < values.Length; i++)
                if (values[i] == target) sum += target;
            return sum;
        }

        /// <summary>Сумма всех дайсов.</summary>
        public static int Sum(int[] values)
        {
            int sum = 0;
            for (int i = 0; i < values.Length; i++) sum += values[i];
            return sum;
        }

        /// <summary>Есть ли N или более одинаковых значений.</summary>
        public static bool NOfAKind(int[] values, int n)
        {
            int[] counts = new int[7];
            for (int i = 0; i < values.Length; i++) counts[values[i]]++;
            for (int v = 1; v <= 6; v++)
                if (counts[v] >= n) return true;
            return false;
        }

        /// <summary>Проверяет фулл-хаус (3 + 2 одинаковых).</summary>
        public static bool IsFullHouse(int[] values)
        {
            int[] counts = new int[7];
            for (int i = 0; i < values.Length; i++) counts[values[i]]++;
            bool hasTwo = false, hasThree = false;
            for (int v = 1; v <= 6; v++)
            {
                if (counts[v] == 2) hasTwo = true;
                if (counts[v] == 3) hasThree = true;
            }
            return hasTwo && hasThree;
        }

        /// <summary>Есть ли последовательность заданной длины.</summary>
        public static bool HasStraightRun(int[] values, int runLength)
        {
            bool[] present = new bool[7];
            for (int i = 0; i < values.Length; i++) present[values[i]] = true;

            int consecutive = 0;
            for (int v = 1; v <= 6; v++)
            {
                consecutive = present[v] ? consecutive + 1 : 0;
                if (consecutive >= runLength) return true;
            }
            return false;
        }
    }
}
