/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.geronimo.microprofile.opentracing.impl;

import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Event;
import jakarta.inject.Inject;

import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
import org.apache.geronimo.microprofile.opentracing.common.impl.FinishedSpan;
import org.apache.geronimo.microprofile.opentracing.common.impl.GeronimoTracer;
import org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator;

import io.opentracing.ScopeManager;

@ApplicationScoped
public class CdiGeronimoTracer extends GeronimoTracer {

    @Inject
    private ScopeManager scopeManager;

    @Inject
    private IdGenerator idGenerator;

    @Inject
    private Event<FinishedSpan> finishedSpanEvent;

    @Inject
    private GeronimoOpenTracingConfig config;


    @PostConstruct
    public void init() {
        setConfig(config);
        setIdGenerator(idGenerator);
        setScopeManager(scopeManager);
        setFinishedSpanEvent(finishedSpanEvent::fire);
        super.init();
    }
}
