using Jiaowu.Api.Domain.Academic;

namespace Jiaowu.Api.Infrastructure.Teaching;

public static class TeachingTaskHours
{
    public static int Calculate(int startWeek, int endWeek, int weeklyHours) =>
        endWeek < startWeek ? 0 : (endWeek - startWeek + 1) * weeklyHours;

    public static int RegularScheduleHours(Course course) =>
        RegularScheduleHours(course.TotalHours, course.PracticeHours);

    public static int RegularScheduleHours(int totalHours, int practiceHours) =>
        Math.Max(0, totalHours - practiceHours);

    public static int TargetHours(
        Course course,
        TeachingTaskSchedulingMode schedulingMode) =>
        schedulingMode == TeachingTaskSchedulingMode.Flexible
            ? course.TotalHours
            : RegularScheduleHours(course);

    public static bool TryResolveRegularWeeklyHours(
        Course course,
        int startWeek,
        int endWeek,
        out int weeklyHours) =>
        TryResolveRegularWeeklyHours(
            course.TotalHours,
            course.PracticeHours,
            startWeek,
            endWeek,
            out weeklyHours);

    public static bool TryResolveRegularWeeklyHours(
        int totalHours,
        int practiceHours,
        int startWeek,
        int endWeek,
        out int weeklyHours)
    {
        weeklyHours = 0;
        var weekCount = endWeek - startWeek + 1;
        var regularHours = RegularScheduleHours(totalHours, practiceHours);
        if (weekCount <= 0 || regularHours % weekCount != 0) return false;

        weeklyHours = regularHours / weekCount;
        return true;
    }

    public static string? Validate(
        Course course,
        int startWeek,
        int endWeek,
        int weeklyHours,
        TeachingTaskSchedulingMode schedulingMode =
            TeachingTaskSchedulingMode.Standard)
    {
        var plannedHours = Calculate(startWeek, endWeek, weeklyHours);
        var targetHours = TargetHours(course, schedulingMode);
        if (plannedHours == targetHours) return null;

        if (schedulingMode == TeachingTaskSchedulingMode.Standard)
        {
            if (targetHours == 0)
            {
                return $"课程“{course.Name}”的 {course.TotalHours} 学时均为实践学时，" +
                       "无需进入普通课表；请将授课方式设为“非排时课程”，并在实验管理中安排。";
            }

            return $"课程“{course.Name}”总学时为 {course.TotalHours}，其中实践学时 " +
                   $"{course.PracticeHours}，普通课表应安排 {targetHours} 学时；当前第 " +
                   $"{startWeek}—{endWeek} 周、每周 {weeklyHours} 学时，共 " +
                   $"{plannedHours} 学时。请调整授课周次或周学时。";
        }

        return $"课程“{course.Name}”总学时为 {course.TotalHours}；当前第 " +
               $"{startWeek}—{endWeek} 周、每周 {weeklyHours} 学时，共 " +
               $"{plannedHours} 学时。请调整授课周次或周学时。";
    }
}
