package com.codebyte.api.config;

import java.time.Duration;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.bind.DefaultValue;

/** Application-specific configuration under the {@code app.*} namespace. */
@ConfigurationProperties(prefix = "app")
public record AppProperties(
        Mail mail,
        Activation activation,
        Reset reset,
        Jwt jwt,
        Login login,
        Cors cors,
        RateLimit rateLimit) {

    public record Mail(@DefaultValue("no-reply@demo.local") String from) {}

    public record Activation(
            @DefaultValue("24h") Duration ttl,
            @DefaultValue("http://localhost:4455") String baseUrl) {}

    public record Reset(@DefaultValue("1h") Duration ttl) {}

    public record RateLimit(
            @DefaultValue("true") boolean enabled,
            @DefaultValue("20") int capacity,
            @DefaultValue("1m") Duration refillPeriod) {}

    public record Jwt(
            String secret,
            @DefaultValue("demo") String issuer,
            @DefaultValue("demo-clients") String audience,
            @DefaultValue("15m") Duration accessTtl,
            @DefaultValue("30d") Duration refreshTtl) {}

    public record Login(
            @DefaultValue("5") int maxFailedAttempts, @DefaultValue("15m") Duration lockDuration) {}

    public record Cors(@DefaultValue("") List<String> allowedOrigins) {}
}
