using PARR.Domain.Entities.JobEntities;
using PARR.Domain.Entities.JobGroupEntities;

namespace PARR.TemplateMatcher.Services.Implementations
{
    /// <summary>
    /// Определяет начальные статусы шаблона и расписания на основе типа группы работ.
    /// Если IsJobGroupAutoControl == true → берём из JobGroup.AutoControl.
    /// Иначе → берём из Job.AutoControl.
    /// </summary>
    public static class AutoControlResolver
    {
        public static (bool IsActiveTemplate, bool IsActiveSchedule) ResolveInitStates(
            Job job,
            JobGroup? jobGroup,
            bool defaultTemplateState = false,
            bool defaultScheduleState = false)
        {
            // Защита от оптимизации: если группу забыли подгрузить, метод честно падает, 
            // потому что без GroupType бизнес-логика не может определить уровень управления
            if (jobGroup == null)
            {
                throw new InvalidOperationException(
                    $"Критическая ошибка бизнес-логики: Для работы '{job.Name}' (ID: {job.Id}) " +
                    $"не передана группа (null). Нужно добавить '.Include(j => j.Group)'.");
            }

            // 1. Проверяем, что разработчики подгрузили GroupType из базы данных
            if (jobGroup.GroupType == null)
            {
                throw new InvalidOperationException(
                    $"Для работы '{job.Name}' (ID: {job.Id}) передана группа, " +
                    $"но её GroupType = null. Нужно добавить '.ThenInclude(g => g.GroupType)' в запрос.");
            }

            // Теперь компилятор знает, что jobGroup и GroupType гарантированно не null
            var isGroupLevel = jobGroup.GroupType.IsJobGroupAutoControl;

            // 2. Сценарий: Управление на уровне Группы Работ
            if (isGroupLevel)
            {
                if (jobGroup.AutoControl == null)
                    throw new InvalidOperationException(
                        $"В типе группы '{jobGroup.GroupType.Id}' указано управление " +
                        $"на уровне ГРУППЫ, но у группы '{jobGroup.GroupName}' (ID: {jobGroup.Id}) " +
                        $"отсутствуют настройки автоконтроля (JobGroup.AutoControl равен null)!");

                return (
                    jobGroup.AutoControl.InitUsedTemplateState,
                    jobGroup.AutoControl.InitUsedScheduleState
                );
            }

            // 3. Сценарий: Управление на уровне конкретной Работы
            if (job.AutoControl == null)
                throw new InvalidOperationException(
                    $"В типе группы '{jobGroup.GroupType.Id}' указано управление " +
                    $"на уровне РАБОТЫ, но у работы '{job.Name}' (ID: {job.Id}) " +
                    $"отсутствуют настройки автоконтроля (Job.AutoControl равен null)!");

            return (
                job.AutoControl.InitUsedTemplateState,
                job.AutoControl.InitUsedScheduleState
            );
        }

    }
}
