package fr.univ.lyon1.common;

import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

/**
 * The client server configuration
 * ToDo should be in gui and not in common ?
 */
public record ServerConfiguration(@NotNull String address, int port) {
    @NotNull
    private static final File file = new File("connection.properties");

    /**
     * Create a configuration
     * @param address the server address
     * @param port the server port
     */
    public ServerConfiguration(@NotNull String address, int port) {
        this.address = address;
        this.port = port;
    }

    /**
     * Load configuration from file
     * @return the configuration
     * @throws IOException if the file doesn't exist
     */
    public static ServerConfiguration load() throws IOException {
        // Check if file non exists, return error to launch server configuration
        if (!file.exists()) {
            System.out.println("File not exists");
            throw new IOException("File not exists");
        }

        @NotNull final Properties properties = new Properties();
        properties.load(new FileReader(file));
        return new ServerConfiguration(properties.getProperty("address"), Integer.parseInt(properties.getProperty("port")));
    }

    /**
     * Save configuration to file
     * @throws IOException if fail to write the file
     */
    public void save() throws IOException {
        @NotNull final Properties properties = new Properties();
        properties.setProperty("address", this.address);
        properties.setProperty("port", String.valueOf(this.port));
        properties.store(new FileWriter(file), "Information needed to connect to the server");
    }

    /**
     * Get the server address
     * @return the server address
     */
    public @NotNull String getAddress() {
        return address;
    }

    /**
     * Get the server port
     * @return the server port
     */
    public int getPort() {
        return port;
    }
}