package com.social.media.application.user.service;

import com.social.media.application.user.command.CreateUserCommand;
import com.social.media.application.user.command.UpdateUserCommand;
import com.social.media.application.user.command.ChangePasswordCommand;
import com.social.media.application.user.command.DeactivateUserCommand;
import com.social.media.application.user.query.GetUserByIdQuery;
import com.social.media.application.user.query.GetUsersByCompanyQuery;
import com.social.media.application.user.dto.UserResponseDto;
import com.social.media.application.user.handler.*;
import com.social.media.domain.user.valueobject.UserId;
import com.social.media.domain.company.valueobject.CompanyId;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * Application Service for User operations
 * Orchestrates commands and queries using handlers
 */
@Service
public class UserApplicationService {
    
    private final CreateUserCommandHandler createUserCommandHandler;
    private final UpdateUserCommandHandler updateUserCommandHandler;
    private final ChangePasswordCommandHandler changePasswordCommandHandler;
    private final DeactivateUserCommandHandler deactivateUserCommandHandler;
    private final GetUserByIdQueryHandler getUserByIdQueryHandler;
    private final GetUsersByCompanyQueryHandler getUsersByCompanyQueryHandler;
    
    public UserApplicationService(
            CreateUserCommandHandler createUserCommandHandler,
            UpdateUserCommandHandler updateUserCommandHandler,
            ChangePasswordCommandHandler changePasswordCommandHandler,
            DeactivateUserCommandHandler deactivateUserCommandHandler,
            GetUserByIdQueryHandler getUserByIdQueryHandler,
            GetUsersByCompanyQueryHandler getUsersByCompanyQueryHandler) {
        this.createUserCommandHandler = createUserCommandHandler;
        this.updateUserCommandHandler = updateUserCommandHandler;
        this.changePasswordCommandHandler = changePasswordCommandHandler;
        this.deactivateUserCommandHandler = deactivateUserCommandHandler;
        this.getUserByIdQueryHandler = getUserByIdQueryHandler;
        this.getUsersByCompanyQueryHandler = getUsersByCompanyQueryHandler;
    }
    
    // Command operations
    public UserResponseDto createUser(CreateUserCommand command) {
        return createUserCommandHandler.handle(command);
    }
    
    public UserResponseDto updateUser(UpdateUserCommand command) {
        return updateUserCommandHandler.handle(command);
    }
    
    public void changePassword(ChangePasswordCommand command) {
        changePasswordCommandHandler.handle(command);
    }
    
    public void deactivateUser(DeactivateUserCommand command) {
        deactivateUserCommandHandler.handle(command);
    }
    
    // Query operations
    public Optional<UserResponseDto> getUserById(UserId userId) {
        return getUserByIdQueryHandler.handle(new GetUserByIdQuery(userId));
    }
    
    public List<UserResponseDto> getUsersByCompany(CompanyId companyId) {
        return getUsersByCompanyQueryHandler.handle(new GetUsersByCompanyQuery(companyId));
    }
}

