using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace bitforum.Models.Page.Banner
{
    [Table("BannerItem")]
    [Index(nameof(Order), Name = "IX_BannerItem_Order")]
    [Index(nameof(IsActive), Name = "IX_BannerItem_IsActive")]
    public class BannerItem
    {
        [ValidateNever]
        [ForeignKey("PositionID")]
        public virtual BannerPosition BannerPosition { get; set; } = null!;

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [DisplayName("PK")]
        [Comment("PK")]
        public int ID { get; set; }

        [Required]
        [DisplayName("배너 위치 ID")]
        [Comment("배너 위치 ID")]
        public int PositionID { get; set; }

        [Required]
        [DisplayName("배너 명")]
        [Comment("배너 명")]
        [DataType(DataType.Text)]
        [StringLength(255)]
        public string Subject { get; set; } = null!;

        [DisplayName("이미지")]
        [Comment("이미지")]
        [RegularExpression(@"\.(jpg|jpeg|png|gif)$", ErrorMessage = "이미지 파일은 jpg, jpeg, png, gif 형식이어야 합니다.")]
        [StringLength(1024)]
        public string? Image { get; set; } = null;

        [DisplayName("가로 크기")]
        [Comment("가로 크기")]
        [Range(1, int.MaxValue, ErrorMessage = "숫자는 1 이상이어야 합니다.")]
        public int? Width { get; set; } = 0;

        [DisplayName("세로 크기")]
        [Comment("세로 크기")]
        [Range(1, int.MaxValue, ErrorMessage = "숫자는 1 이상이어야 합니다.")]
        public int? Height { get; set; } = 0;

        [DisplayName("주소")]
        [Comment("주소")]
        [DataType(DataType.Url)]
        [StringLength(255)]
        public string? Link { get; set; } = null;

        [Required]
        [DisplayName("순서")]
        [Comment("순서")]
        public int Order { get; set; } = 0;

        [Required]
        [DisplayName("사용 여부")]
        [Comment("사용 여부")]
        public bool IsActive { get; set; } = false;

        [DisplayName("사용 기간 - 시작")]
        [Comment("사용 기간 - 시작")]
        [DataType(DataType.DateTime)]
        public DateTime? StartAt { get; set; } = null;

        [DisplayName("사용 기간 - 종료")]
        [Comment("사용 기간 - 종료")]
        [DataType(DataType.DateTime)]
        public DateTime? EndAt { get; set; } = null;

        [DisplayName("조회 수")]
        [Comment("조회 수")]
        public int Views { get; set; } = 0;

        [DisplayName("수정 일시")]
        [Comment("수정 일시")]
        [DataType(DataType.DateTime)]
        public DateTime? UpdatedAt { get; set; } = null;

        [DisplayName("등록 일시")]
        [Comment("등록 일시")]
        [DataType(DataType.DateTime)]
        public DateTime CreatedAt { get; set; }
    }
}
