/**
 * Archive Feature Use Case
 *
 * Transitions a feature's lifecycle to Archived, storing the current lifecycle
 * in previousLifecycle for restoration on unarchive.
 *
 * Business Rules:
 * - Any feature can be archived except those already Archived or Deleting
 * - Features with children CAN be archived — children visually reconnect to
 *   the repository on the canvas but the parent-child relationship is preserved
 *   in the database and restored when "Show Archived" is enabled
 * - The current lifecycle is preserved in previousLifecycle for unarchive restoration
 * - No git operations or agent cancellations are triggered (archive is non-destructive)
 */
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
};
import { injectable, inject } from 'tsyringe';
import { SdlcLifecycle } from '../../../domain/generated/output.js';
/** Lifecycle states that cannot be archived. */
const NON_ARCHIVABLE_STATES = new Set([
    SdlcLifecycle.Archived,
    SdlcLifecycle.Deleting,
]);
let ArchiveFeatureUseCase = class ArchiveFeatureUseCase {
    featureRepo;
    constructor(featureRepo) {
        this.featureRepo = featureRepo;
    }
    async execute(featureId) {
        // 1. Find feature (exact or prefix match)
        const feature = (await this.featureRepo.findById(featureId)) ??
            (await this.featureRepo.findByIdPrefix(featureId));
        if (!feature) {
            throw new Error(`Feature not found: "${featureId}"`);
        }
        // 2. Validate lifecycle is archivable
        if (NON_ARCHIVABLE_STATES.has(feature.lifecycle)) {
            throw new Error(`Cannot archive feature "${feature.name}": lifecycle is ${feature.lifecycle}. ` +
                `Features that are already archived or being deleted cannot be archived.`);
        }
        // 3. Store current lifecycle and transition to Archived
        const updatedFeature = {
            ...feature,
            previousLifecycle: feature.lifecycle,
            lifecycle: SdlcLifecycle.Archived,
            updatedAt: new Date(),
        };
        await this.featureRepo.update(updatedFeature);
        return updatedFeature;
    }
};
ArchiveFeatureUseCase = __decorate([
    injectable(),
    __param(0, inject('IFeatureRepository')),
    __metadata("design:paramtypes", [Object])
], ArchiveFeatureUseCase);
export { ArchiveFeatureUseCase };
