package demo;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.List;

import org.springframework.mock.web.MockHttpSession;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;

/** Writes every printed line to cap/ so each number in the post is a captured, asserted fact. */
abstract class MfaTestSupport {

    static final Path OUT = Path.of("cap");

    static void say(String file, String line) throws IOException {
        System.out.println(line);
        Files.createDirectories(OUT);
        Files.writeString(OUT.resolve(file), line + System.lineSeparator(),
                StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    }

    /** Authorities stored in the session's SecurityContext, or [] if there is none. */
    static List<String> authorities(MockHttpSession session) {
        Object ctx = session.getAttribute("SPRING_SECURITY_CONTEXT");
        if (!(ctx instanceof SecurityContext sc) || sc.getAuthentication() == null) {
            return List.of();
        }
        Authentication a = sc.getAuthentication();
        return a.getAuthorities().stream().map(GrantedAuthority::getAuthority).sorted().toList();
    }
}
