package com.social.media.application.content.service;

import com.social.media.application.content.command.*;
import com.social.media.application.content.dto.PostResponseDto;
import com.social.media.application.content.handler.*;
import com.social.media.application.content.query.*;
import com.social.media.domain.company.valueobject.CompanyId;
import com.social.media.domain.content.valueobject.PostId;
import com.social.media.domain.content.valueobject.PostStatus;
import com.social.media.domain.user.valueobject.UserId;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Application Service for Content Management Context
 * Orchestrates commands and queries through dedicated handlers
 */
@Service
public class ContentApplicationService {
    
    private final CreatePostCommandHandler createPostCommandHandler;
    private final UpdatePostCommandHandler updatePostCommandHandler;
    private final SchedulePostCommandHandler schedulePostCommandHandler;
    private final PublishPostCommandHandler publishPostCommandHandler;
    private final CancelPostCommandHandler cancelPostCommandHandler;
    private final DeletePostCommandHandler deletePostCommandHandler;
    private final GetPostByIdQueryHandler getPostByIdQueryHandler;
    private final GetPostsByCompanyQueryHandler getPostsByCompanyQueryHandler;
    private final GetPostsByAuthorQueryHandler getPostsByAuthorQueryHandler;
    private final GetScheduledPostsQueryHandler getScheduledPostsQueryHandler;
    
    public ContentApplicationService(
            CreatePostCommandHandler createPostCommandHandler,
            UpdatePostCommandHandler updatePostCommandHandler,
            SchedulePostCommandHandler schedulePostCommandHandler,
            PublishPostCommandHandler publishPostCommandHandler,
            CancelPostCommandHandler cancelPostCommandHandler,
            DeletePostCommandHandler deletePostCommandHandler,
            GetPostByIdQueryHandler getPostByIdQueryHandler,
            GetPostsByCompanyQueryHandler getPostsByCompanyQueryHandler,
            GetPostsByAuthorQueryHandler getPostsByAuthorQueryHandler,
            GetScheduledPostsQueryHandler getScheduledPostsQueryHandler) {
        this.createPostCommandHandler = createPostCommandHandler;
        this.updatePostCommandHandler = updatePostCommandHandler;
        this.schedulePostCommandHandler = schedulePostCommandHandler;
        this.publishPostCommandHandler = publishPostCommandHandler;
        this.cancelPostCommandHandler = cancelPostCommandHandler;
        this.deletePostCommandHandler = deletePostCommandHandler;
        this.getPostByIdQueryHandler = getPostByIdQueryHandler;
        this.getPostsByCompanyQueryHandler = getPostsByCompanyQueryHandler;
        this.getPostsByAuthorQueryHandler = getPostsByAuthorQueryHandler;
        this.getScheduledPostsQueryHandler = getScheduledPostsQueryHandler;
    }
    
    // Command Operations
    
    /**
     * Create a new post
     */
    public PostResponseDto createPost(CreatePostCommand command) {
        return createPostCommandHandler.handle(command);
    }
    
    /**
     * Update an existing post
     */
    public PostResponseDto updatePost(UpdatePostCommand command) {
        return updatePostCommandHandler.handle(command);
    }
    
    /**
     * Schedule a post for future publishing
     */
    public PostResponseDto schedulePost(SchedulePostCommand command) {
        return schedulePostCommandHandler.handle(command);
    }
    
    /**
     * Publish a post immediately
     */
    public PostResponseDto publishPost(PublishPostCommand command) {
        return publishPostCommandHandler.handle(command);
    }
    
    /**
     * Cancel a scheduled post
     */
    public void cancelPost(CancelPostCommand command) {
        cancelPostCommandHandler.handle(command);
    }
    
    /**
     * Delete a post permanently
     */
    public void deletePost(DeletePostCommand command) {
        deletePostCommandHandler.handle(command);
    }
    
    // Query Operations
    
    /**
     * Get post by ID
     */
    public PostResponseDto getPostById(String postId) {
        GetPostByIdQuery query = new GetPostByIdQuery(PostId.of(postId));
        return getPostByIdQueryHandler.handle(query);
    }
    
    /**
     * Get posts by company with optional status filtering
     */
    public List<PostResponseDto> getPostsByCompany(String companyId, PostStatus status, int page, int size) {
        GetPostsByCompanyQuery query = new GetPostsByCompanyQuery(
            CompanyId.of(Long.valueOf(companyId)),
            status,
            page,
            size
        );
        return getPostsByCompanyQueryHandler.handle(query);
    }
    
    /**
     * Get posts by author
     */
    public List<PostResponseDto> getPostsByAuthor(String authorId, PostStatus status, int page, int size) {
        GetPostsByAuthorQuery query = new GetPostsByAuthorQuery(
            UserId.of(authorId),
            status,
            page,
            size
        );
        return getPostsByAuthorQueryHandler.handle(query);
    }
    
    /**
     * Get scheduled posts
     */
    public List<PostResponseDto> getScheduledPosts(String companyId, int page, int size) {
        GetScheduledPostsQuery query = new GetScheduledPostsQuery(
            companyId != null ? CompanyId.of(Long.valueOf(companyId)) : null,
            page,
            size
        );
        return getScheduledPostsQueryHandler.handle(query);
    }
}

