"use strict";
/**
 * CapacitacionService - Servicio para catálogo de capacitaciones HSE
 *
 * Gestión de capacitaciones con CRUD y filtros.
 *
 * @module HSE
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.CapacitacionService = void 0;
class CapacitacionService {
    repository;
    constructor(repository) {
        this.repository = repository;
    }
    async findAll(ctx, filters = {}, page = 1, limit = 20) {
        const skip = (page - 1) * limit;
        const queryBuilder = this.repository
            .createQueryBuilder('capacitacion')
            .where('capacitacion.tenant_id = :tenantId', { tenantId: ctx.tenantId });
        if (filters.tipo) {
            queryBuilder.andWhere('capacitacion.tipo = :tipo', { tipo: filters.tipo });
        }
        if (filters.activo !== undefined) {
            queryBuilder.andWhere('capacitacion.activo = :activo', { activo: filters.activo });
        }
        if (filters.search) {
            queryBuilder.andWhere('(capacitacion.codigo ILIKE :search OR capacitacion.nombre ILIKE :search)', { search: `%${filters.search}%` });
        }
        queryBuilder
            .orderBy('capacitacion.nombre', 'ASC')
            .skip(skip)
            .take(limit);
        const [data, total] = await queryBuilder.getManyAndCount();
        return {
            data,
            meta: {
                total,
                page,
                limit,
                totalPages: Math.ceil(total / limit),
            },
        };
    }
    async findById(ctx, id) {
        return this.repository.findOne({
            where: {
                id,
                tenantId: ctx.tenantId,
            },
        });
    }
    async findByCodigo(ctx, codigo) {
        return this.repository.findOne({
            where: {
                codigo,
                tenantId: ctx.tenantId,
            },
        });
    }
    async create(ctx, dto) {
        const existing = await this.findByCodigo(ctx, dto.codigo);
        if (existing) {
            throw new Error(`Capacitacion with codigo ${dto.codigo} already exists`);
        }
        const capacitacion = this.repository.create({
            tenantId: ctx.tenantId,
            codigo: dto.codigo,
            nombre: dto.nombre,
            descripcion: dto.descripcion,
            tipo: dto.tipo,
            duracionHoras: dto.duracionHoras || 1,
            vigenciaMeses: dto.vigenciaMeses,
            requiereEvaluacion: dto.requiereEvaluacion || false,
            calificacionMinima: dto.calificacionMinima,
            activo: true,
        });
        return this.repository.save(capacitacion);
    }
    async update(ctx, id, dto) {
        const existing = await this.findById(ctx, id);
        if (!existing) {
            return null;
        }
        const updated = this.repository.merge(existing, dto);
        return this.repository.save(updated);
    }
    async toggleActive(ctx, id) {
        const existing = await this.findById(ctx, id);
        if (!existing) {
            return null;
        }
        existing.activo = !existing.activo;
        return this.repository.save(existing);
    }
    async getByTipo(ctx, tipo) {
        return this.repository.find({
            where: {
                tenantId: ctx.tenantId,
                tipo,
                activo: true,
            },
            order: { nombre: 'ASC' },
        });
    }
}
exports.CapacitacionService = CapacitacionService;
//# sourceMappingURL=capacitacion.service.js.map