"use strict";
/**
 * PuestoService - Servicio para catálogo de puestos
 *
 * Gestión de puestos de trabajo con CRUD básico.
 *
 * @module HR
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.PuestoService = void 0;
class PuestoService {
    repository;
    constructor(repository) {
        this.repository = repository;
    }
    async findAll(ctx, filters = {}, page = 1, limit = 20) {
        const skip = (page - 1) * limit;
        const queryBuilder = this.repository
            .createQueryBuilder('puesto')
            .where('puesto.tenant_id = :tenantId', { tenantId: ctx.tenantId });
        if (filters.activo !== undefined) {
            queryBuilder.andWhere('puesto.activo = :activo', { activo: filters.activo });
        }
        if (filters.nivelRiesgo) {
            queryBuilder.andWhere('puesto.nivel_riesgo = :nivelRiesgo', { nivelRiesgo: filters.nivelRiesgo });
        }
        if (filters.search) {
            queryBuilder.andWhere('(puesto.codigo ILIKE :search OR puesto.nombre ILIKE :search)', { search: `%${filters.search}%` });
        }
        queryBuilder
            .orderBy('puesto.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,
            },
            relations: ['empleados'],
        });
    }
    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(`Puesto with codigo ${dto.codigo} already exists`);
        }
        const puesto = this.repository.create({
            tenantId: ctx.tenantId,
            codigo: dto.codigo,
            nombre: dto.nombre,
            descripcion: dto.descripcion,
            nivelRiesgo: dto.nivelRiesgo,
            requiereCapacitacionEspecial: dto.requiereCapacitacionEspecial || false,
            activo: true,
        });
        return this.repository.save(puesto);
    }
    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 getActiveCount(ctx) {
        return this.repository.count({
            where: {
                tenantId: ctx.tenantId,
                activo: true,
            },
        });
    }
}
exports.PuestoService = PuestoService;
//# sourceMappingURL=puesto.service.js.map