/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.samples.vehicles.ignite.init;

import javax.sql.DataSource;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteSpring;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.configuration.DataStorageConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 *
 * @author lenovo
 */
@Configuration
public class IgniteConfig {

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    private final String storePath = "/store";
    private final String walPath = "/wal";
    private final String walArchivePath = walPath + "/archive";
    private final String workPath = "/work";

    @Autowired
    private IgniteProperties igniteProperties;

    @Autowired
    private ApplicationContext context;

    @Autowired
    @Qualifier("igniteSpiDatasoure")
    private DataSource igniteSpiDatasource;

    @Bean
    public Ignite igniteServerMode() throws IgniteCheckedException {
        // Apache Ignite node configuration.
        IgniteConfiguration igniteConfiguration = new IgniteConfiguration();

        // Ignite persistence configuration.
        DataStorageConfiguration dataStorageConfiguration = new DataStorageConfiguration();

        //set dataStorageConfiguration
        {
            // Enabling the writes throttling.
            dataStorageConfiguration.setWriteThrottlingEnabled(true);

            //prsist data region
            DataRegionConfiguration dataRegionConfiguration = dataStorageConfiguration.getDefaultDataRegionConfiguration();
            // Enabling the persistence.
            dataRegionConfiguration.setPersistenceEnabled(true);
            //set persist region name
            dataRegionConfiguration.setName(igniteProperties.getPersistRegionName());
            // Increasing the buffer size to 1 GB.
            dataRegionConfiguration.setCheckpointPageBufferSize(1024 * 1024 * 1024);

            // Creating a new cache region.
            DataRegionConfiguration cacheRegionConfiguration = new DataRegionConfiguration();
            // Region name.
            cacheRegionConfiguration.setName(igniteProperties.getCacheRegionName());
            // Setting initial RAM size 100M
            cacheRegionConfiguration.setInitialSize(100 * 1024 * 1024);
            // Setting maximum RAM size 1G
            cacheRegionConfiguration.setMaxSize(1024 * 1024 * 1024);
            // Setting the data region configuration.
            dataStorageConfiguration.setDataRegionConfigurations(cacheRegionConfiguration);

            if (!igniteProperties.getDataPath().equalsIgnoreCase("local")) {
                //set work path
                igniteConfiguration.setWorkDirectory(igniteProperties.getDataPath() + workPath);
                //set store path
                dataStorageConfiguration.setStoragePath(igniteProperties.getDataPath() + storePath);
                dataStorageConfiguration.setWalPath(igniteProperties.getDataPath() + walPath);
                dataStorageConfiguration.setWalArchivePath(igniteProperties.getDataPath() + walArchivePath);
            }

            // Applying settings.
            igniteConfiguration.setDataStorageConfiguration(dataStorageConfiguration);
        }

        //set cluster config
        {
            //add cluster config
            TcpDiscoverySpi tcpDiscoverSpi = new TcpDiscoverySpi();
            TcpDiscoveryJdbcIpFinder ipFinder = new TcpDiscoveryJdbcIpFinder();
            // Configure your DataSource.
            ipFinder.setDataSource(igniteSpiDatasource);
            tcpDiscoverSpi.setIpFinder(ipFinder);
            tcpDiscoverSpi.setNetworkTimeout(igniteProperties.getNetworkTimeout());
            igniteConfiguration.setDiscoverySpi(tcpDiscoverSpi);
        }

        //set sql client port
        {
            //add sql connection configuration
            ClientConnectorConfiguration clientConnectorConfiguration = new ClientConnectorConfiguration();
            clientConnectorConfiguration.setPort(igniteProperties.getSqlPort());
            igniteConfiguration.setClientConnectorConfiguration(clientConnectorConfiguration);
        }

        //start ignite
        Ignite ignite = IgniteSpring.start(igniteConfiguration, context);
        ignite.active(true);
        return ignite;
    }

}
