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

namespace WebApplication1.Models
{
    public class ExternalLoginConfirmationViewModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Името е задолжително.")]
        [StringLength(50, ErrorMessage = "Името мора да е под 50 букви.")]
        public string Name { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Презимето е задолжително.")]
        [StringLength(50, ErrorMessage = "Презимето мора да е под 50 букви.")]
        public string Surname { get; set; }

        [StringLength(1000, ErrorMessage = "Кратката биографија мора да е под 1000 карактери.")]
        public string Biography { get; set; }

        public List<string> Subjects { get; set; }
        public List<string> Topics { get; set; }
        public virtual List<Project> Projects { get; set; }

        [Required]
        public string UserType { get; set; }

        //STUDENT

        [RegularExpression(@"^\d{6}$", ErrorMessage = "Индексот мора да се состои од 6 цифри.")]
        public string Index { get; set; }
        public string Major { get; set; }
        [Range(1, 3, ErrorMessage = "Циклус на студии мора да е помеѓу 1 и 3.")]
        public int? Cycle { get; set; }
        [Range(1, 8, ErrorMessage = "Семестар мора да е помеѓу 1 и 8.")]
        public int? Semester { get; set; }

        //MENTOR
        public string Timeslots { get; set; } // times available
        public string TypesOfProject { get; set; }
        [Required]
        public bool Available { get; set; }
        public string ImageURL { get; set; }
    }

    public class ExternalLoginListViewModel
    {
        public string ReturnUrl { get; set; }
    }

    public class SendCodeViewModel
    {
        public string SelectedProvider { get; set; }
        public ICollection<System.Web.Mvc.SelectListItem> Providers { get; set; }
        public string ReturnUrl { get; set; }
        public bool RememberMe { get; set; }
    }

    public class VerifyCodeViewModel
    {
        [Required]
        public string Provider { get; set; }

        [Required]
        [Display(Name = "Code")]
        public string Code { get; set; }
        public string ReturnUrl { get; set; }

        [Display(Name = "Remember this browser?")]
        public bool RememberBrowser { get; set; }

        public bool RememberMe { get; set; }
    }

    public class ForgotViewModel
    {
        [Required]
        [Display(Name = "Email")]
        public string Email { get; set; }
    }

    public class LoginViewModel
    {
        [Required]
        [Display(Name = "E-mail")]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Лозинка")]
        public string Password { get; set; }

        [Display(Name = "Запомни ме")]
        public bool RememberMe { get; set; }
    }

    public class RegisterViewModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "Лозинката мора да е подолга од 6 карактери.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "Лозинките не се совпаѓаат.")]
        public string ConfirmPassword { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Името е задолжително.")]
        [StringLength(50, ErrorMessage = "Името мора да е под 50 букви.")]
        public string Name { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Презимето е задолжително.")]
        [StringLength(50, ErrorMessage = "Презимето мора да е под 50 букви.")]
        public string Surname { get; set; }

        [StringLength(1000, ErrorMessage = "Кратката биографија мора да е под 1000 карактери.")]
        public string Biography { get; set; }

        public List<string> Subjects { get; set; }
        public List<string> Topics { get; set; }
        public virtual List<Project> Projects { get; set; }

        [Required]
        public string UserType { get; set; }

        //STUDENT

        [RegularExpression(@"^\d{6}$", ErrorMessage = "Индексот мора да се состои од 6 цифри.")]
        public string Index { get; set; }
        public string Major { get; set; }
        [Range(1, 3, ErrorMessage = "Циклус на студии мора да е помеѓу 1 и 3.")]
        public int? Cycle { get; set; }
        [Range(1, 8, ErrorMessage = "Семестар мора да е помеѓу 1 и 8.")]
        public int? Semester { get; set; }

        //MENTOR
        public string Timeslots { get; set; } // times available
        public string TypesOfProject { get; set; }
        [Required]
        public bool Available { get; set; }
        public string ImageURL { get; set; }

    }

    public class EditStudentModel
    {
        public string Id { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Името е задолжително.")]
        [StringLength(50, ErrorMessage = "Името мора да е под 50 букви.")]
        public string Name { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Презимето е задолжително.")]
        [StringLength(50, ErrorMessage = "Презимето мора да е под 50 букви.")]
        public string Surname { get; set; }

        [StringLength(1000, ErrorMessage = "Кратката биографија мора да е под 1000 карактери.")]
        public string Biography { get; set; }
        public string Email { get; set; }
        public List<string> Subjects { get; set; } = new List<string>();
        public List<string> Topics { get; set; } = new List<string>();
        public virtual List<Project> Projects { get; set; }

        [RegularExpression(@"^\d{6}$", ErrorMessage = "Index must be exactly 6 digits.")]
        public string Index { get; set; }
        public string Major { get; set; }

        [Range(1, 3, ErrorMessage = "Cycle must be between 1 and 3.")]
        public int? Cycle { get; set; }
        [Range(1, 8, ErrorMessage = "Semester must be between 1 and 8.")]
        public int? Semester { get; set; }

    }
    public class EditMentorModel
    {
        public string Id { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Името е задолжително.")]
        [StringLength(50, ErrorMessage = "Името мора да е под 50 букви.")]
        public string Name { get; set; }

        [RegularExpression(@"^[\p{IsCyrillic}\p{IsBasicLatin}\s\-]+$", ErrorMessage = "Името смее да содржи само латиница, кирилица, празни места и цртички.")]
        [Required(ErrorMessage = "Презимето е задолжително.")]
        [StringLength(50, ErrorMessage = "Презимето мора да е под 50 букви.")]
        public string Surname { get; set; }

        [StringLength(1000, ErrorMessage = "Кратката биографија мора да е под 1000 карактери.")]
        public string Biography { get; set; }
        public string Email { get; set; }
        public List<string> Subjects { get; set; } = new List<string>();
        public List<string> Topics { get; set; } = new List<string>();
        public virtual List<Project> Projects { get; set; }

        [DisplayName("When are you available?")]
        public string Timeslots { get; set; } // times available

        [DisplayName("What types of projects are you open to mentoring?")]
        public string TypesOfProject { get; set; }
        [Required]
        [DisplayName("Are you accepting student requests?")]
        public bool Available { get; set; }
        public string ImageURL { get; set; }
        public List<OpinionDto> ApprovedOpinions { get; set; } = new List<OpinionDto>();
        public List<OpinionDto> PendingOpinions { get; set; } = new List<OpinionDto>();
        public List<TopicSuggestionDto> TopicSuggestions { get; set; } = new List<TopicSuggestionDto>();


    }
    public class TopicSuggestionCreateModel
    {
        [Required]
        public string Title { get; set; }
        public string Description { get; set; }
    }

    public class TopicAssignModel
    {
        [Required]
        public int TopicId { get; set; }
        [Required]
        public string StudentId { get; set; }
    }

    public class TopicSuggestionDto
        {
            public int Id { get; set; }
            public string Title { get; set; }
            public string Description { get; set; }
            public bool IsAssigned { get; set; }
            public string AssignedStudentId { get; set; }
            public string AssignedStudentName { get; set; }
            public System.DateTime CreatedAt { get; set; }
        }
    

    public class ReplyViewModel
    {

        [Required]
        public string ToUserId { get; set; }

        [StringLength(200)]
        public string Subject { get; set; }

        [Required]
        [StringLength(2000)]
        public string Body { get; set; }

        public int? RequestId { get; set; } // original MentorContact id
    }

    public class OpinionViewModel
    {
        [Required]
        public string MentorId { get; set; }

        [Required]
        [StringLength(2000)]
        public string Content { get; set; }

        // optional rating
        public int? Rating { get; set; }
    }

    public class ResetPasswordViewModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "Лозинката мора да е подолга од 6 карактери.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "Лозинките не се совпаѓаат.")]
        public string ConfirmPassword { get; set; }

        public string Code { get; set; }
    }

    public class ForgotPasswordViewModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }
    }
}
