using Microsoft.EntityFrameworkCore;
using PetCompanion.Models;

namespace PetCompanion.Data
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
        {
        }

        public DbSet<Pet> Pets { get; set; }
        public DbSet<PetStats> PetStats { get; set; }
        public DbSet<Resources> Resources { get; set; }
        public DbSet<Skill> Skills { get; set; }
        public DbSet<SkillEffect> SkillEffects { get; set; }
        public DbSet<PetSkill> PetSkills { get; set; }
        public DbSet<GameItem> GameItems { get; set; }
        public DbSet<Inventory> Inventories { get; set; }
        public DbSet<EquippedItem> EquippedItems { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // Configure DateTime properties to be stored as UTC
            modelBuilder.Entity<Pet>()
                .Property(p => p.GatherActionSince)
                .HasConversion(
                    v => v.ToUniversalTime(),
                    v => DateTime.SpecifyKind(v, DateTimeKind.Utc));

            modelBuilder.Entity<Pet>()
                .Property(p => p.BasicActionCooldown)
                .HasConversion(
                    v => v != DateTime.MinValue ? v.ToUniversalTime() : v,
                    v => v != DateTime.MinValue ? DateTime.SpecifyKind(v, DateTimeKind.Utc) : v);

            modelBuilder.Entity<PetSkill>()
                .HasOne(ps => ps.Pet)
                .WithMany(p => p.Skills)
                .HasForeignKey(ps => ps.PetId);

            modelBuilder.Entity<PetSkill>()
                .HasOne(ps => ps.Skill)
                .WithMany(s => s.PetSkills)
                .HasForeignKey(ps => ps.SkillId);

            modelBuilder.Entity<SkillEffect>()
                .HasOne(se => se.Skill)
                .WithMany(s => s.Effects)
                .HasForeignKey(se => se.SkillId);

            modelBuilder.Entity<EquippedItem>()
                .HasOne(e => e.Pet)
                .WithMany(p => p.EquippedItemsList)
                .HasForeignKey(e => e.PetId);

            modelBuilder.Entity<EquippedItem>()
                .HasOne(e => e.GameItem)
                .WithMany()
                .HasForeignKey(e => e.GameItemId);

            // Seed initial skills
            var skills = SkillsData.GetInitialSkills();
            var skillWithoutEffects = SkillsData.GetInitialSkills().Select(s => new Skill
            {
                Id = s.Id,
                Name = s.Name,
                Type = s.Type,
                Description = s.Description,
                PointsCost = s.PointsCost,
                Icon = s.Icon,
                SkillsIdRequired = s.SkillsIdRequired
            }).ToList();

            foreach (var skill in skillWithoutEffects)
            {
                modelBuilder.Entity<Skill>().HasData(skill);
            }

            foreach (var skill in skills)
            {
                foreach (var effect in skill.Effects)
                {
                    modelBuilder.Entity<SkillEffect>().HasData(effect);
                }
            }
        }
    }
}