package <%= packageName %>.controller;

import <%= packageName %>.entity.Role;
import <%= packageName %>.entity.User;
import <%= packageName %>.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

@RestController
@RequestMapping("/api/v1/admin")
@RequiredArgsConstructor
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
public class AdminController {

    private final UserRepository userRepository;

    /** GET /api/v1/admin/users — list all users */
    @GetMapping("/users")
    public ResponseEntity<List<User>> listUsers() {
        return ResponseEntity.ok(userRepository.findAll());
    }

    /** GET /api/v1/admin/users/{id} — get single user */
    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return userRepository.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }

    /** PUT /api/v1/admin/users/{id}/role — assign role */
    @PutMapping("/users/{id}/role")
    public ResponseEntity<Map<String, String>> assignRole(
            @PathVariable Long id,
            @RequestBody Map<String, String> body) {

        String roleName = body.get("role");
        Role role;
        try {
            role = Role.valueOf(roleName);
        } catch (IllegalArgumentException e) {
            return ResponseEntity.badRequest()
                    .body(Map.of("error", "Invalid role: " + roleName + ". Use ROLE_USER or ROLE_ADMIN"));
        }

        return userRepository.findById(id).map(user -> {
            user.setRoles(new HashSet<>(Set.of(role)));
            userRepository.save(user);
            return ResponseEntity.ok(Map.of("message", "Role updated to " + roleName));
        }).orElse(ResponseEntity.notFound().build());
    }

    /** DELETE /api/v1/admin/users/{id} — delete user */
    @DeleteMapping("/users/{id}")
    public ResponseEntity<Map<String, String>> deleteUser(@PathVariable Long id) {
        if (!userRepository.existsById(id)) {
            return ResponseEntity.notFound().build();
        }
        userRepository.deleteById(id);
        return ResponseEntity.ok(Map.of("message", "User deleted"));
    }

    /** GET /api/v1/admin/stats — quick dashboard stats */
    @GetMapping("/stats")
    public ResponseEntity<Map<String, Long>> stats() {
        long total = userRepository.count();
        long admins = userRepository.findAll().stream()
                .filter(User::isAdmin)
                .count();
        return ResponseEntity.ok(Map.of(
                "totalUsers", total,
                "admins", admins,
                "regularUsers", total - admins
        ));
    }
}
