import { IConversationRepository } from "../repositories/IConversationRepository";
import { Conversation } from "../entities/Conversation";
export type ConversationStatus = "open" | "closed" | "pending" | "assigned" | "resolved";
export interface ConversationStateTransition {
    from: ConversationStatus;
    to: ConversationStatus;
    allowed: boolean;
    requiresAssignment?: boolean;
    autoAssign?: boolean;
}
export interface ConversationStateConfig {
    organizationId: string;
    autoAssignEnabled: boolean;
    autoAssignUserId?: string;
    maxResponseTime: number;
    autoCloseAfterHours: number;
}
export declare class ConversationStateService {
    private conversationRepository;
    private readonly stateTransitions;
    constructor(conversationRepository: IConversationRepository);
    /**
     * Cambia el estado de una conversación
     */
    changeConversationState(conversationId: string, organizationId: string, newStatus: ConversationStatus, assignedToUserId?: string): Promise<Conversation>;
    /**
     * Asigna una conversación a un usuario
     */
    assignConversation(conversationId: string, organizationId: string, userId: string): Promise<Conversation>;
    /**
     * Desasigna una conversación
     */
    unassignConversation(conversationId: string, organizationId: string): Promise<Conversation>;
    /**
     * Marca una conversación como resuelta
     */
    resolveConversation(conversationId: string, organizationId: string): Promise<Conversation>;
    /**
     * Cierra una conversación
     */
    closeConversation(conversationId: string, organizationId: string): Promise<Conversation>;
    /**
     * Reabre una conversación cerrada
     */
    reopenConversation(conversationId: string, organizationId: string): Promise<Conversation>;
    /**
     * Pone una conversación en espera
     */
    putConversationOnHold(conversationId: string, organizationId: string): Promise<Conversation>;
    /**
     * Obtiene conversaciones por estado
     */
    getConversationsByStatus(organizationId: string, status: ConversationStatus): Promise<Conversation[]>;
    /**
     * Obtiene conversaciones asignadas a un usuario
     */
    getConversationsByUser(organizationId: string, userId: string): Promise<Conversation[]>;
    /**
     * Obtiene estadísticas de conversaciones
     */
    getConversationStats(organizationId: string): Promise<{
        total: number;
        open: number;
        assigned: number;
        pending: number;
        resolved: number;
        closed: number;
    }>;
    /**
     * Verifica si una transición de estado es válida
     */
    private isValidTransition;
    /**
     * Obtiene la configuración de transición entre dos estados
     */
    private getTransition;
    /**
     * Obtiene todos los estados disponibles para una conversación
     */
    getAvailableStates(currentStatus: ConversationStatus): ConversationStatus[];
    /**
     * Verifica si una conversación puede ser asignada
     */
    canBeAssigned(status: ConversationStatus): boolean;
    /**
     * Verifica si una conversación puede ser cerrada
     */
    canBeClosed(status: ConversationStatus): boolean;
    /**
     * Verifica si una conversación puede ser resuelta
     */
    canBeResolved(status: ConversationStatus): boolean;
}
//# sourceMappingURL=ConversationStateService.d.ts.map