using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace Mirea.Api.Dto.Responses;

/// <summary>
/// Represents a response object containing schedule information.
/// </summary>
public class ScheduleResponse
{
    /// <summary>
    /// Gets or sets the day of the week for the schedule entry.
    /// </summary>
    [Required]
    public DayOfWeek DayOfWeek { get; set; }

    /// <summary>
    /// Gets or sets the pair number for the schedule entry.
    /// </summary>
    [Required]
    public int PairNumber { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the pair is on an even week.
    /// </summary>
    [Required]
    public bool IsEven { get; set; }

    /// <summary>
    /// Gets or sets the name of the discipline for the schedule entry.
    /// </summary>
    [Required]
    public required string Discipline { get; set; }

    /// <summary>
    /// Gets or sets the ID of the discipline for the schedule entry.
    /// </summary>
    [Required]
    public required int DisciplineId { get; set; }

    /// <summary>
    /// Gets or sets exclude or include weeks for a specific discipline.
    /// </summary>
    /// <remarks>
    /// If is <see langword="true"/>, then the values in <see cref="Weeks"/> show the weeks when there will be no discipline.
    /// <br/>
    /// If is <see langword="false"/>, then the values in <see cref="Weeks"/> indicate the weeks during which a particular discipline will be studied.
    /// <br/>
    /// If is <see langword="null"/>, then there are no specific <see cref="Weeks"/>
    /// </remarks>
    ///
    public bool? IsExcludedWeeks { get; set; }

    /// <summary>
    /// The week numbers required for the correct display of the schedule.
    /// <br/>
    /// Whether there will be <see cref="Discipline"/> during the week or not depends on the <see cref="IsExcludedWeeks"/> property.
    /// </summary>
    /// <remarks>
    /// To get the current week's number, use other queries.
    /// </remarks>
    public IEnumerable<int>? Weeks { get; set; }

    /// <summary>
    /// Gets or sets the type of occupation for the schedule entry.
    /// </summary>
    [Required]
    public required IEnumerable<string> TypeOfOccupations { get; set; }

    /// <summary>
    /// Gets or sets the name of the group for the schedule entry.
    /// </summary>
    [Required]
    public required string Group { get; set; }

    /// <summary>
    /// Gets or sets the ID of the group for the schedule entry.
    /// </summary>
    [Required]
    public required int GroupId { get; set; }

    /// <summary>
    /// Gets or sets the names of the lecture halls for the schedule entry.
    /// </summary>
    public required IEnumerable<string?> LectureHalls { get; set; }

    /// <summary>
    /// Gets or sets the IDs of the lecture halls for the schedule entry.
    /// </summary>
    public required IEnumerable<int?> LectureHallsId { get; set; }

    /// <summary>
    /// Gets or sets the names of the professors for the schedule entry.
    /// </summary>
    public required IEnumerable<string?> Professors { get; set; }

    /// <summary>
    /// Gets or sets the IDs of the professors for the schedule entry.
    /// </summary>
    public required IEnumerable<int?> ProfessorsId { get; set; }

    /// <summary>
    /// Gets or sets the names of the campuses for the schedule entry.
    /// </summary>
    public required IEnumerable<string?> Campus { get; set; }

    /// <summary>
    /// Gets or sets the IDs of the campuses for the schedule entry.
    /// </summary>
    public required IEnumerable<int?> CampusId { get; set; }

    /// <summary>
    /// Gets or sets the links to online meetings for the schedule entry.
    /// </summary>
    public required IEnumerable<string?> LinkToMeet { get; set; }
}