/*
 * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch das
 * Ministerium für Energiewende, Klimaschutz, Umwelt und Natur Zentrales
 * IT-Management
 *
 * Lizenziert unter der EUPL, Version 1.2 oder - sobald diese von der
 * Europäischen Kommission genehmigt wurden - Folgeversionen der EUPL
 * ("Lizenz"); Sie dürfen dieses Werk ausschließlich gemäß dieser Lizenz nutzen.
 * Eine Kopie der Lizenz finden Sie hier:
 *
 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
 *
 * Sofern nicht durch anwendbare Rechtsvorschriften gefordert oder in
 * schriftlicher Form vereinbart, wird die unter der Lizenz verbreitete Software
 * "so wie sie ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
 * ausdrücklich oder stillschweigend - verbreitet. Die sprachspezifischen
 * Genehmigungen und Beschränkungen unter der Lizenz sind dem Lizenztext zu
 * entnehmen.
 */
package de.ozgcloud.admin.security;

import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.core.oidc.StandardClaimNames;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.web.SecurityFilterChain;

import lombok.RequiredArgsConstructor;

@Configuration
@EnableMethodSecurity(securedEnabled = true)
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {

	private final AdminAuthenticationEntryPoint authenticationEntryPoint;

	@Bean
	SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

		http.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));

		http.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

		http.exceptionHandling(eh -> eh.authenticationEntryPoint(authenticationEntryPoint));

		http.authorizeHttpRequests(requests -> requests
				.requestMatchers(HttpMethod.GET, "/api/environment").permitAll()
				.requestMatchers("/api").authenticated()
				.requestMatchers("/api/**").authenticated()
				.requestMatchers("/actuator").permitAll()
				.requestMatchers("/actuator/**").permitAll()
				.requestMatchers("/configserver/**").permitAll()
				.anyRequest().denyAll());

		return http.build();
	}

	@Bean
	JwtAuthenticationConverter jwtAuthenticationConverter() {
		var jwtConverter = new JwtAuthenticationConverter();
		jwtConverter.setJwtGrantedAuthoritiesConverter(jwt -> List.of(() -> "ROLE_USER"));
		jwtConverter.setPrincipalClaimName(StandardClaimNames.PREFERRED_USERNAME);
		return jwtConverter;
	}

}