Data Model

namespace Merchant
{
    public class MerchantDetailModel
    {
        /// <summary>
        /// Merchant's Unique Id
        /// </summary>
        [Required]
        public Guid MerchantId { get; set; }

        /// <summary>
        /// Merchant's Abn Number
        /// </summary>
        [MaxLength(512)]
        [Required]
        public string Abn { get; set; }

        /// <summary>
        /// Merchant Modified Date
        /// </summary>
        public DateTime? ModifiedOn { get; set; }

        /// <summary>
        /// Merchant Created Date
        /// </summary>
        [Required]
        public DateTime CreatedOn { get; set; }

        /// <summary>
        /// The Primary currency, Merchant operates on
        /// </summary>
        [MaxLength(5)]
        public string Currency { get; set; }

        /// <summary>
        /// Merchant's Description
        /// </summary>
        [MaxLength(1024)]
        public string Description { get; set; }

        /// <summary>
        /// Merchant's location google place identifier
        /// </summary>
        [MaxLength(500)]
        public string GooglePlaceId { get; set; }

        /// <summary>
        /// Merchant's Active Status
        /// </summary>
        [Required]
        public bool IsActive { get; set; }

        /// <summary>
        /// Merchant's Category
        /// </summary>
        [MaxLength(200)]
        [Required]
        public string MerchantCategory { get; set; }

        /// <summary>
        /// Merchant's Location Country
        /// </summary>
        [MaxLength(50)]
        [Required]
        public string MerchantCountry { get; set; }

        /// <summary>
        /// Merchant's Location Country Code
        /// </summary>
        [MaxLength(5)]
        [Required]
        public string MerchantCountryCode { get; set; }

        /// <summary>
        /// Merchant Identifier
        /// </summary>
        [MaxLength(50)]
        public string MID { get; set; }

        /// <summary>
        /// The name of the Merchant
        /// </summary>
        [MaxLength(200)]
        [Required]
        public string MerchantName { get; set; }

        /// <summary>
        /// Merchant's Location PostCode
        /// </summary>
        [MaxLength(10)]
        [Required]
        public string Postcode { get; set; }

        /// <summary>
        /// Merchant's Location State
        /// </summary>
        [MaxLength(200)]
        [Required]
        public string State { get; set; }

        /// <summary>
        /// Merchant's Location Suburb
        /// </summary>
        [MaxLength(200)]
        [Required]
        public string Suburb { get; set; }

        ///// <summary>
        ///// Merchant's Trading Name
        ///// </summary>
        [MaxLength(100)]
        [Required]
        public string TradingName { get; set; }

        /// <summary>
        /// Merchant's Website
        /// </summary>
        [MaxLength(512)]
        public string Website { get; set; }

        /// <summary>
        /// Denotes if the MID of the Merchant is Verified
        /// </summary>
        public bool IsValidMID { get; set; }

        /// <summary>
        /// Merchant's Logo Detail
        /// </summary>
        public ImageModel Logo { get; set; }

        /// <summary>
        /// Merchant's Banner List
        /// </summary>
        public List<ImageModel> Banners { get; set; }

        /// <summary>
        /// Merchant's Locations List
        /// </summary>
        public IEnumerable<MerchantLocationResp>? Locations { get; set; }
    }
  
    public class ImageModel
    {
        /// <summary>
        /// Image Id
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Name of the Image
        /// </summary>
        [MaxLength(512)]
        [Required]
        public string FileName { get; set; }

        /// <summary>
        /// Type of the Image
        /// </summary>
        [MaxLength(20)]
        [Required]
        public string FileType { get; set; }

        /// <summary>
        /// The Image URL
        /// </summary>
        [MaxLength(600)]
        [Required]
        public string PreSignedUrl { get; set; }
    }
  
    public class MerchantLocationResp
    {
       
        public int MerchantId { get; set; }

        /// <summary>
        /// Unique Location Id
        /// </summary>
        [Required]
        public int LocationId { get; set; }

        /// <summary>
        /// Address of the Location
        /// </summary>
        [Required]
        [MaxLength(512)]
        public string Address { get; set; }

        /// <summary>
        /// City of the Location
        /// </summary>
        [Required]
        [MaxLength(50)]
        public string City { get; set; }

        /// <summary>
        /// State of the Location
        /// </summary>
        [Required]
        [MaxLength(50)]
        public string State { get; set; }

        /// <summary>
        /// PostCode of the Location
        /// </summary>
        [Required]
        [MaxLength(10)]
        public string PostCode { get; set; }

        /// <summary>
        /// Country of the Location
        /// </summary>
        [Required]
        [MaxLength(100)]
        public string Country { get; set; }

        public string Email { get; set; }

        /// <summary>
        /// The Location Type
        /// </summary>
        public int? LocationTypeId { get; set; }

        /// <summary>
        /// Unique Location Reference
        /// </summary>
        [Required]
        [MaxLength(100)]
        public string LocationReferenceIdentifier { get; set; }

        /// <summary>
        /// Google place identifier for the location
        /// </summary>
        [MaxLength(500)]
        public string GooglePlaceId { get; set; }

        /// <summary>
        /// Location Latitude
        /// </summary>
        public double? Latitude { get; set; }

        /// <summary>
        /// Location Longitude
        /// </summary>
        public double? Longitude { get; set; }

        /// <summary>
        /// Description of the Location
        /// </summary>
        [MaxLength(1024)]
        public string LocationDescription { get; set; }

        /// <summary>
        /// Phone Number of the Location
        /// </summary>
        [MaxLength(50)]
        public string PhoneNumber { get; set; }

        public DateTime? CreatedOn { get; set; }

        public DateTime? ModifiedOn { get; set; }

        /// <summary>
        /// Name of the Location Merchant
        /// </summary>
        [Required]
        [MaxLength(200)]
        public string LocationName { get; set; }

        /// <summary>
        /// Merchant Identifier for the Location
        /// </summary>
        [MaxLength(50)]
        public string LocationMID { get; set; }

        /// <summary>
        /// Denotes if the MID of the Location is Verified
        /// </summary>
        public bool IsValidMID { get; set; }

        /// <summary>
        /// List of Operating Hours
        /// </summary>
        [Required]
        public List<TradingHours> TradingHours { get; set; }

        /// <summary>
        /// List of Location Images
        /// </summary>
        public List<ImageModel>? LocationImages { get; set; }
       
        public int TotalRows { get; set; }

        /// <summary>
        /// Merchant Primary Location
        /// </summary>
        [Required]
        public bool IsPrimaryLocation { get; set; }

        /// <summary>
        /// Offers Mapped to this location
        /// </summary>
        public Guid[] MappedOffers { get; set; }
    }
  
    public class TradingHours
    {
        /// <summary>
        /// Unique Identifier for the Operating Day
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// The Day of Operation
        /// </summary>
        [Required]
        [MaxLength(10)]
        public string Day { get; set; }

        /// <summary>
        /// Operation Start time
        /// </summary>
        [Required]
        [MaxLength(10)]
        public string OpenTime { get; set; }

        /// <summary>
        /// Operation End time
        /// </summary>
        [Required]
        [MaxLength(10)]
        public string CloseTime { get; set; }

        /// <summary>
        /// Status of Location for that day ex: Open/Close
        /// </summary>
        [Required]
        [MaxLength(5)]
        public string Status { get; set; }
    }
}