package com.munjaon.client.config;

import com.munjaon.client.server.service.CollectClientService;
import com.munjaon.client.server.service.DataMoveService;
import com.munjaon.client.server.service.PropertyLoader;
import com.munjaon.client.server.service.ReportClientService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Slf4j
@Configuration
@RequiredArgsConstructor
public class RunnerConfiguration {
    private final ServerConfig serverConfig;

    @Bean
    @Order(1)
    public CommandLineRunner getRunnerBeanForProperty() throws ConfigurationException {
        System.setProperty("PROPS", serverConfig.getServerProperyFile());
        System.setProperty("ROOTPATH", serverConfig.getServerRootPath());
        System.setProperty("DBMS", serverConfig.getString("DB.DBMS"));
        PropertyLoader.load();

        return args -> System.out.println("Runner Bean #1 : " + serverConfig.getServerProperyFile());
    }

    @Bean
    @Order(2)
    public CommandLineRunner getRunnerBeanForSms() {
        try {
            String serviceName = "SMS";
            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
            CollectClientService collectClientService = new CollectClientService(serviceName, serviceType);
            collectClientService.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return args -> System.out.println("Runner Bean #2");
    }

    @Bean
    @Order(2)
    public CommandLineRunner getRunnerBeanForLms() {
        try {
            String serviceName = "LMS";
            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
            CollectClientService collectClientService = new CollectClientService(serviceName, serviceType);
            collectClientService.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return args -> System.out.println("Runner Bean #2");
    }

    @Bean
    @Order(2)
    public CommandLineRunner getRunnerBeanForMms() {
        try {
            String serviceName = "MMS";
            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
            CollectClientService collectClientService = new CollectClientService(serviceName, serviceType);
            collectClientService.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return args -> System.out.println("Runner Bean #2");
    }

    @Bean
    @Order(2)
    public CommandLineRunner getRunnerBeanForKat() {
        try {
            String serviceName = "KAT";
            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
            CollectClientService collectClientService = new CollectClientService(serviceName, serviceType);
            collectClientService.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return args -> System.out.println("Runner Bean #2");
    }

    @Bean
    @Order(2)
    public CommandLineRunner getRunnerBeanForKft() {
        try {
            String serviceName = "KFT";
            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
            CollectClientService collectClientService = new CollectClientService(serviceName, serviceType);
            collectClientService.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return args -> System.out.println("Runner Bean #2");
    }

    @Bean
    @Order(2)
    public CommandLineRunner getRunnerBeanForReport() {
        try {
            String serviceName = "REPORT";
            ReportClientService reportClientService = new ReportClientService(serviceName);
            reportClientService.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return args -> System.out.println("Runner Bean #2");
    }

    @Bean
    @Order(3)
    public CommandLineRunner getRunnerBeanForMove() {
        try {
            String serviceName = "LOG_MOVE";
            DataMoveService dataMoveService = new DataMoveService(serviceName);
            dataMoveService.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return args -> System.out.println("Runner Bean #2");
    }
}
