import { EntityManager } from 'typeorm';
import { RegistrationStatusEnum } from '../enum/registration-status.enum';
import { ApprovalStatusEnum } from '../enum/approval-status.enum';
import { RegistrationFlowConfig } from '../config/registration-flow.config';
export type StatusTrigger = 'payment' | 'approval' | 'travel' | 'submission' | 'cancellation' | 'hold' | 'manual' | 'rejected' | 'save_as_draft';
export interface StatusTransitionResult {
    oldStatus: RegistrationStatusEnum;
    newStatus: RegistrationStatusEnum;
    isChanged: boolean;
    reason?: string;
    missingRequirements?: string[];
}
export declare class RegistrationStatusManagerService {
    private readonly logger;
    private readonly rolePermissions;
    private getRolePermissions;
    validateTransitionPermission(fromStatus: RegistrationStatusEnum, toStatus: RegistrationStatusEnum, userRoles: string[]): {
        isValid: boolean;
        reason?: string;
    };
    updateRegistrationStatus(registrationId: number, trigger: StatusTrigger, manager: EntityManager, userId?: number, userRoles?: string[]): Promise<StatusTransitionResult>;
    private determineStatusAfterSubmission;
    getMissingRequirements(registrationId: number, manager: EntityManager): Promise<string[]>;
    canComplete(registrationId: number, manager: EntityManager): Promise<{
        canComplete: boolean;
        missingRequirements: string[];
    }>;
    getFlowConfig(registrationId: number, manager: EntityManager): Promise<RegistrationFlowConfig>;
    setStatus(registrationId: number, targetStatus: RegistrationStatusEnum, manager: EntityManager, userId: number, userRoles: string[], reason?: string): Promise<StatusTransitionResult>;
    getAllowedNextStatuses(registrationId: number, userRoles: string[], manager: EntityManager): Promise<RegistrationStatusEnum[]>;
    updatePaymentStatus(paymentId: number, newStatus: string, manager: EntityManager, userId?: number): Promise<void>;
    updateTravelInfoStatus(travelInfoId: number, newStatus: string, manager: EntityManager, userId?: number): Promise<void>;
    updateTravelPlanStatus(travelPlanId: number, newStatus: string, manager: EntityManager, userId?: number): Promise<void>;
    updateApprovalStatus(approvalId: number, newStatus: ApprovalStatusEnum, manager: EntityManager, userId?: number, reason?: string): Promise<void>;
}
