using AyCode.Entities.Locations;
using AyCode.Interfaces.TimeStampInfo;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using TIAM.Core.Enums;
using TIAM.Entities.Addresses;
using TIAM.Entities.TransferDestinations;
using TIAM.Resources;

namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
{
    public class TransferDestinationWizardModel
    {
        [DataType(DataType.Text)]
        [Display(Name = ResourceKeys.TransferDestinationId, ResourceType = typeof(TIAMResources))]
        public string Id { get; set; }

        //[Required(ErrorMessage = "The Username value should be specified.")]
        [Required(ErrorMessage = "The Destination name should be specified.")]
        [DataType(DataType.Text)]
        [Display(Name = ResourceKeys.DestinationName, ResourceType = typeof(TIAMResources))]
        public string Name { get; set; }

        [Required(ErrorMessage = "The Destination info should be specified.")]
        [DataType(DataType.MultilineText)]
        [Display(Name = ResourceKeys.DestinationInfo, ResourceType = typeof(TIAMResources))]
        public string Description { get; set; }

        [Required(ErrorMessage = "The address should be specified.")]
        [DataType(DataType.Text)]
        [Display(Name = ResourceKeys.DestinationAddress, ResourceType = typeof(TIAMResources))]
        public string AddressString { get; set; }

        [Required(ErrorMessage = "The price should be specified.")]
        [DataType("Price")]
        [Display(Name = ResourceKeys.Price, ResourceType = typeof(TIAMResources))]
        public double Price { get; set; }
        
        public PriceType PriceType { get; set; }

        //[DataType("Latitude")]        
        //[Display(Name = "Destination latitude")]
        //public double Latitude { get; set; }
        //[DataType("Longitude")]
        //[Display(Name = "Destination longitude")]
        //public double Longitude { get; set; }


        public TransferDestinationWizardModel() { }

        public TransferDestinationWizardModel(string name, string description, string address, double price, PriceType priceType) :this(Guid.NewGuid(), name, description, address, price, priceType)
        { }
        public TransferDestinationWizardModel(Guid id, string name, string description, string address, double price, PriceType priceType)
        {
        
            Id = id.ToString();
            Name = name;
            Description = description;
            AddressString = address;
            Price = price;
            PriceType = priceType;
        }

        public static TransferDestination SaveToTransferDestination(TransferDestinationWizardModel model)
            => SaveToTransferDestination(model, new TransferDestination());

        public static TransferDestination SaveToTransferDestination(TransferDestinationWizardModel model, TransferDestination destination)
        {
            destination.Id = Guid.Parse(model.Id);
            destination.Name = model.Name;
            destination.Description = model.Description;
            destination.AddressString = model.AddressString;
            destination.Price = model.Price;
            destination.PriceType = model.PriceType;

            if (destination.Address == null)
            {
                var addressId = Guid.NewGuid();

                destination.Address = new Address();
                destination.AddressId = addressId;
                destination.Address.Id = addressId;
            }
            Random rand = new Random();
            int range = 42;
            
            destination.Address.AddressText = model.AddressString;
            destination.Address.Longitude = rand.NextDouble() * range; 
            destination.Address.Latitude = rand.NextDouble() * range; 
            return destination;
        }
    }    
}
