package com.emonster.taroaichat.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * Properties specific to Tarot Ai Chat.
 * <p>
 * Properties are configured in the {@code application.yml} file.
 * See {@link tech.jhipster.config.JHipsterProperties} for a good example.
 */
@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false)
public class ApplicationProperties {

    private final Liquibase liquibase = new Liquibase();

    // jhipster-needle-application-properties-property

    public Liquibase getLiquibase() {
        return liquibase;
    }

    // jhipster-needle-application-properties-property-getter

    public static class Liquibase {

        private Boolean asyncStart = true;

        public Boolean getAsyncStart() {
            return asyncStart;
        }

        public void setAsyncStart(Boolean asyncStart) {
            this.asyncStart = asyncStart;
        }
    }
    // jhipster-needle-application-properties-property-class

    private final Security security = new Security();
    private final Twilio twilio = new Twilio();
    private final OpenRouter openrouter = new OpenRouter();
    private final Gemini gemini = new Gemini();
    private final Stripe stripe = new Stripe();

    public Security getSecurity() {
        return security;
    }

    public Twilio getTwilio() {
        return twilio;
    }

    public OpenRouter getOpenrouter() {
        return openrouter;
    }

    public Gemini getGemini() {
        return gemini;
    }

    public Stripe getStripe() {
        return stripe;
    }

    public static class Security {
        private final Authentication authentication = new Authentication();
        public Authentication getAuthentication() { return authentication; }

        public static class Authentication {
            private final Jwt jwt = new Jwt();
            public Jwt getJwt() { return jwt; }

            public static class Jwt {
                private String base64Secret;
                private final RefreshToken refreshToken = new RefreshToken();

                private Long tokenValidityInSeconds;
                private Long tokenValidityInSecondsForRememberMe;

                public String getBase64Secret() { return base64Secret; }
                public void setBase64Secret(String base64Secret) { this.base64Secret = base64Secret; }

                public RefreshToken getRefreshToken() { return refreshToken; }

                public Long getTokenValidityInSeconds() {
                    return tokenValidityInSeconds;
                }

                public void setTokenValidityInSeconds(Long tokenValidityInSeconds) {
                    this.tokenValidityInSeconds = tokenValidityInSeconds;
                }

                public Long getTokenValidityInSecondsForRememberMe() {
                    return tokenValidityInSecondsForRememberMe;
                }

                public void setTokenValidityInSecondsForRememberMe(Long tokenValidityInSecondsForRememberMe) {
                    this.tokenValidityInSecondsForRememberMe = tokenValidityInSecondsForRememberMe;
                }

                public static class RefreshToken {
                    private String base64Secret;
                    public String getBase64Secret() { return base64Secret; }
                    public void setBase64Secret(String base64Secret) { this.base64Secret = base64Secret; }
                }
            }
        }
    }

    public static class Twilio {
        private String accountSid;
        private String authToken;
        private String verifyServiceSid;
        private boolean enabled = true;

        public String getAccountSid() {
            return accountSid;
        }

        public void setAccountSid(String accountSid) {
            this.accountSid = accountSid;
        }

        public String getAuthToken() {
            return authToken;
        }

        public void setAuthToken(String authToken) {
            this.authToken = authToken;
        }

        public String getVerifyServiceSid() {
            return verifyServiceSid;
        }

        public void setVerifyServiceSid(String verifyServiceSid) {
            this.verifyServiceSid = verifyServiceSid;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    }

    public static class OpenRouter {

        private String apiKey;
        private String baseUrl;
        private boolean enabled;
        private final ModelConfig model = new ModelConfig();
        private final ParametersConfig parameters = new ParametersConfig();

        public String getApiKey() {
            return apiKey;
        }

        public void setApiKey(String apiKey) {
            this.apiKey = apiKey;
        }

        public String getBaseUrl() {
            return baseUrl;
        }

        public void setBaseUrl(String baseUrl) {
            this.baseUrl = baseUrl;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public ModelConfig getModel() {
            return model;
        }

        public ParametersConfig getParameters() {
            return parameters;
        }

        public static class ModelConfig {
            private String primary;
            private String fallback;

            public String getPrimary() {
                return primary;
            }

            public void setPrimary(String primary) {
                this.primary = primary;
            }

            public String getFallback() {
                return fallback;
            }

            public void setFallback(String fallback) {
                this.fallback = fallback;
            }
        }

        public static class ParametersConfig {
            private double temperature;
            private int maxTokens;
            private double topP;

            public double getTemperature() {
                return temperature;
            }

            public void setTemperature(double temperature) {
                this.temperature = temperature;
            }

            public int getMaxTokens() {
                return maxTokens;
            }

            public void setMaxTokens(int maxTokens) {
                this.maxTokens = maxTokens;
            }

            public double getTopP() {
                return topP;
            }

            public void setTopP(double topP) {
                this.topP = topP;
            }
        }
    }

    public static class Gemini {

        private String apiKey;
        private boolean enabled;
        private final ModelConfig model = new ModelConfig();
        private final ParametersConfig parameters = new ParametersConfig();

        public String getApiKey() {
            return apiKey;
        }

        public void setApiKey(String apiKey) {
            this.apiKey = apiKey;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public ModelConfig getModel() {
            return model;
        }

        public ParametersConfig getParameters() {
            return parameters;
        }

        public static class ModelConfig {
            private String primary;
            private String fallback;

            public String getPrimary() {
                return primary;
            }

            public void setPrimary(String primary) {
                this.primary = primary;
            }

            public String getFallback() {
                return fallback;
            }

            public void setFallback(String fallback) {
                this.fallback = fallback;
            }
        }

        public static class ParametersConfig {
            private float temperature;
            private int maxTokens;
            private float topP;
            private float topK;

            public float getTemperature() {
                return temperature;
            }

            public void setTemperature(float temperature) {
                this.temperature = temperature;
            }

            public int getMaxTokens() {
                return maxTokens;
            }

            public void setMaxTokens(int maxTokens) {
                this.maxTokens = maxTokens;
            }

            public float getTopP() {
                return topP;
            }

            public void setTopP(float topP) {
                this.topP = topP;
            }

            public float getTopK() {
                return topK;
            }

            public void setTopK(float topK) {
                this.topK = topK;
            }
        }
    }

    public static class Stripe {
        private String merchantSecret;
        private boolean enabled = true;

        public String getMerchantSecret() {
            return merchantSecret;
        }

        public void setMerchantSecret(String merchantSecret) {
            this.merchantSecret = merchantSecret;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    }
}
