package com.social.media.infrastructure.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

/**
 * Configuration for Hibernate/JPA specific settings
 */
@Configuration
public class HibernateConfig {

    @Value("${spring.jpa.hibernate.ddl-auto:update}")
    private String ddlAuto;

    /**
     * Customize Hibernate properties to ensure schema creation works properly
     */
    @Bean
    public HibernatePropertiesCustomizer hibernatePropertiesCustomizer() {
        return (Map<String, Object> hibernateProperties) -> {
            // Enable schema creation for custom schemas
            hibernateProperties.put("hibernate.hbm2ddl.create_namespaces", true);
            
            // Ensure proper schema handling
            hibernateProperties.put("hibernate.default_schema", "core_business");
            
            // Enable batch DDL for better performance
            hibernateProperties.put("hibernate.order_inserts", true);
            hibernateProperties.put("hibernate.order_updates", true);
            hibernateProperties.put("hibernate.jdbc.batch_size", 25);
            hibernateProperties.put("hibernate.jdbc.batch_versioned_data", true);
            
            // Set proper naming strategy
            hibernateProperties.put("hibernate.physical_naming_strategy", 
                "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy");
            hibernateProperties.put("hibernate.implicit_naming_strategy", 
                "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        };
    }
}
