package hr.com.port.ips.eracun.boot;

import hr.com.port.functions.Functions;
import hr.com.port.ips.eracun.provider.mer.MerClient;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
import org.apache.log4j.Logger;

public final class EracunSyncConfig {
	static Logger logger = Logger.getLogger(EracunSyncConfig.class);
    private final Properties p = new Properties();

    public EracunSyncConfig(Path file) {
        try (InputStream in = Files.newInputStream(file)) {
            p.load(in);
        } catch (IOException e) {
            logger.error(new Functions().logging(e));
            throw new IllegalStateException("Ne mogu učitati properties: " + file);
        }
    }	
	
	public boolean inboxEnabled() { return Boolean.parseBoolean(p.getProperty("sync.inbox.enabled", "false")); }
    public boolean outboxEnabled() { return Boolean.parseBoolean(p.getProperty("sync.outbox.enabled", "true")); }	
    public long inboxPeriodSeconds() { return Long.parseLong(p.getProperty("sync.inbox.periodSeconds", "60")); }
    public long outboxPeriodSeconds() { return Long.parseLong(p.getProperty("sync.outbox.periodSeconds", "60")); }
	public long initialDelaySeconds() { return Long.parseLong(p.getProperty("sync.initialDelaySeconds", "5")); }

    public boolean processInboxEnabled() { return Boolean.parseBoolean(p.getProperty("process.inbox.enabled", "false")); }
    public boolean processOutboxEnabled() { return Boolean.parseBoolean(p.getProperty("process.outbox.enabled", "true")); }
	public long processInboxPeriodSeconds() { return Long.parseLong(p.getProperty("process.inbox.periodSeconds", "60")); }
    public long processOutboxPeriodSeconds() { return Long.parseLong(p.getProperty("process.outbox.periodSeconds", "60")); }
    public long processInitialDelaySeconds() { return Long.parseLong(p.getProperty("process.initialDelaySeconds", "5")); }
	
	public boolean fiscalization20Enabled() { return Boolean.parseBoolean(p.getProperty("fisc20.enabled", "true")); }
	public long fiscalization20PeriodSeconds() { return Long.parseLong(p.getProperty("fisc20.PeriodSeconds", "60")); }
	public long fiscalization20InitialDelaySeconds() { return Long.parseLong(p.getProperty("fisc20.initialDelaySeconds", "60")); }

	public boolean markPaidEnabled() { return Boolean.parseBoolean(p.getProperty("markPaid.enabled", "true")); }
	public long markPaidPeriodSeconds() { return Long.parseLong(p.getProperty("markPaid.PeriodSeconds", "60")); }
	public long markPaidInitialDelaySeconds() { return Long.parseLong(p.getProperty("markPaid.initialDelaySeconds", "60")); }
	
	public boolean rejectEnabled() { return Boolean.parseBoolean(p.getProperty("reject.enabled", "true")); }
	public long rejectPeriodSeconds() { return Long.parseLong(p.getProperty("reject.PeriodSeconds", "60")); }
	public long rejectInitialDelaySeconds() { return Long.parseLong(p.getProperty("reject.initialDelaySeconds", "60")); }
	
	public boolean ereportingEnabled() { return Boolean.parseBoolean(p.getProperty("ereporting.enabled", "true")); }
	public long ereportingPeriodSeconds() { return Long.parseLong(p.getProperty("ereporting.PeriodSeconds", "60")); }
	public long ereportingInitialDelaySeconds() { return Long.parseLong(p.getProperty("ereporting.initialDelaySeconds", "10")); }

	public String baseDir() { return p.getProperty("baseDir"); }    
	public int orphansPerSession() { return Integer.parseInt(p.getProperty("sync.orphansPerSession", "2")); }
	public int relinksPerSession() { return Integer.parseInt(p.getProperty("sync.relinksPerSession", "2")); }
	
	// expose API creds as needed
	public int posrednikId() { return Integer.parseInt(p.getProperty("posrednikId")); }
    public String baseUrl() { return p.getProperty("baseUrl"); }
    public String username() { return p.getProperty("username"); }
	public String password() { return p.getProperty("password"); }
	public String companyId() { return p.getProperty("companyId"); }
	public String companyBu() { return p.getProperty("companyBu"); }
	public String softwareId() { return p.getProperty("softwareId"); }
	
	public MerClient createMerClient() {
		return new MerClient(
				baseUrl(),
				Long.valueOf(username()),
				password(),
				companyId(),
				companyBu(),
				softwareId()
		);
	}
}