package com.heaerie.server.auth201.Auth201Server.controller;

import com.heaerie.server.auth201.Auth201Server.dto.ClientRegistrationRequest;
import com.heaerie.server.auth201.Auth201Server.dto.ClientRegistrationResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

@Controller
@RequestMapping("/oauth")
public class ClientRegistrationController {

    private final PasswordEncoder passwordEncoder;

    public ClientRegistrationController(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }

    @GetMapping("/register")
    public String showRegistrationForm() {
        return "register-client";
    }

    @PostMapping("/register")
    @ResponseBody
    public ResponseEntity<ClientRegistrationResponse> registerClient(@RequestBody ClientRegistrationRequest request) {
        // Generate client ID
        String clientId = generateClientId(request.getClientName());
        
        // Generate client secret for confidential clients
        String clientSecret = null;
        if ("confidential".equals(request.getClientType())) {
            clientSecret = generateClientSecret();
        }

        ClientRegistrationResponse response = new ClientRegistrationResponse();
        response.setClientId(clientId);
        response.setClientSecret(clientSecret);
        response.setClientType(request.getClientType());
        response.setMessage("Client registered successfully");

        return ResponseEntity.ok(response);
    }

    private String generateClientId(String clientName) {
        // Create a client ID based on the name and a UUID
        String sanitized = clientName.toLowerCase()
                .replaceAll("[^a-z0-9-]", "-")
                .replaceAll("-+", "-")
                .replaceAll("^-|-$", "");
        
        String shortUuid = UUID.randomUUID().toString().substring(0, 8);
        return sanitized + "-" + shortUuid;
    }

    private String generateClientSecret() {
        // Generate a secure random secret
        return UUID.randomUUID().toString().replace("-", "") + 
               UUID.randomUUID().toString().replace("-", "");
    }
}
