package at.tuwien.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.images.PullPolicy;

import java.io.File;

@Configuration
public class TusdContainerConfig {

    public static TusdContainer getContainer() {
        return TusdContainer.getInstance();
    }

    @Bean
    public TusdContainer tusdContainer() {
        return getContainer();
    }

    /**
     * This class represents the customized MariaDB container. It is a singleton to avoid the recreation of containers
     * which can be very time-consuming.
     */
    public static class TusdContainer extends GenericContainer<TusdContainer> {

        private static TusdContainer instance;

        private boolean started = false;

        public static synchronized TusdContainer getInstance() {
            final File filePath = new File("pre-create.sh");
            if (instance == null) {
                instance = new TusdContainer("tusproject/tusd:v2.4.0");
                instance.withFileSystemBind(filePath.getAbsolutePath(), "/srv/tusd-hooks/pre-create", BindMode.READ_ONLY);
                instance.withExposedPorts(8080);
                instance.withCommand("-max-size=2000000000",
                        "-base-path=/api/upload/files/",
                        "-hooks-dir=/srv/tusd-hooks/");
                instance.withImagePullPolicy(PullPolicy.alwaysPull());
            }
            return instance;
        }

        private TusdContainer(String dockerImageName) {
            super(dockerImageName);
        }

        @Override
        protected void configure() {
            super.configure();
        }

        @Override
        public synchronized void start() {
            if (!started) {
                super.stop();
                super.start();
                started = true;
            }
        }

        @Override
        public void stop() {
            // do nothing, JVM handles shut down
        }
    }
}