package com.t2404e.aihealthcoach.util;

import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import com.t2404e.aihealthcoach.entity.User;
import com.t2404e.aihealthcoach.enums.UserRole;
import com.t2404e.aihealthcoach.repository.UserRepository;

import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
@lombok.extern.slf4j.Slf4j
@SuppressWarnings("null") // Suppress null warnings for Lombok-generated builders
public class UserSeeder implements CommandLineRunner {

    private final UserRepository userRepository;
    private final com.t2404e.aihealthcoach.repository.HealthProfileRepository healthProfileRepository;
    private final com.t2404e.aihealthcoach.repository.HealthAnalysisRepository healthAnalysisRepository;
    private final PasswordEncoder passwordEncoder;

    @Override
    public void run(String... args) {
        seedAdmin();
        seedUsers();
    }

    private void seedAdmin() {
        if (userRepository.findByEmail("admin@aihealth.com").isPresent()) {
            return;
        }

        User admin = User.builder()
                .fullName("System Admin")
                .email("admin@aihealth.com")
                .passwordHash(passwordEncoder.encode("Admin@123"))
                .role(UserRole.ADMIN)
                .status(1)
                .isPremium(true)
                .build();

        userRepository.save(admin);
        log.info("✅ Admin account seeded: admin@aihealth.com / Admin@123");
    }

    private void seedUsers() {
        if (userRepository.count() > 5) {
            log.info("ℹ️ Users already seeded, skipping...");
            return;
        }

        log.info("🌱 Seeding 20 test users...");
        String mockAnalysisJson = "{"
                + "\"analysis\": {"
                + "\"bmi\": 22.5,"
                + "\"bmr\": 1500,"
                + "\"tdee\": 2200,"
                + "\"healthStatus\": \"NORMAL\","
                + "\"summary\": \"User mockup data generated by seeder.\""
                + "},"
                + "\"threeMonthPlan\": {"
                + "\"goal\": \"Maintenance\","
                + "\"totalTargetWeightChangeKg\": 0,"
                + "\"months\": ["
                + "{\"month\": 1, \"title\": \"Month 1\", \"dailyCalories\": 2000, \"note\": \"Mock plan\"}"
                + "]"
                + "}"
                + "}";

        for (int i = 1; i <= 20; i++) {
            String email = "user" + i + "@gmail.com";
            if (userRepository.findByEmail(email).isPresent()) continue;

            // 1. Create User
            User user = User.builder()
                    .fullName("Test User " + i)
                    .email(email)
                    .passwordHash(passwordEncoder.encode("User@123"))
                    .role(UserRole.USER)
                    .status(1)
                    .isPremium(false)
                    .build();
            user = userRepository.save(user);

            // 2. Create Profile
            com.t2404e.aihealthcoach.entity.HealthProfile profile = com.t2404e.aihealthcoach.entity.HealthProfile.builder()
                    .userId(user.getId())
                    .gender(i % 2 == 0 ? com.t2404e.aihealthcoach.enums.Gender.MALE : com.t2404e.aihealthcoach.enums.Gender.FEMALE)
                    .age(20 + i)
                    .height(160.0 + (i % 20))
                    .weight(50.0 + (i % 30))
                    .activityLevel(com.t2404e.aihealthcoach.enums.ActivityLevel.MODERATE)
                    .stressLevel(com.t2404e.aihealthcoach.enums.StressLevel.MEDIUM)
                    .sleepDuration(com.t2404e.aihealthcoach.enums.SleepDuration.SEVEN_TO_NINE)
                    .build();
            healthProfileRepository.save(profile);

            // 3. Create Analysis
            com.t2404e.aihealthcoach.entity.HealthAnalysis analysis = com.t2404e.aihealthcoach.entity.HealthAnalysis.builder()
                    .userId(user.getId())
                    .analysisJson(mockAnalysisJson)
                    .build();
            healthAnalysisRepository.save(analysis);
        }
        System.out.println("✅ 20 Test Users seeded successfully (user1@gmail.com -> user20@gmail.com / User@123)");
    }
}
