/*
 * JBoss, Home of Professional Open Source
 * Copyright 2010, Red Hat, Inc., and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * Licensed 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.jboss.cdi.tck.tests.extensions.alternative.metadata;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;

@SuppressWarnings("unused")
@ApplicationScoped
@Expensive
public class Grocery implements Shop {
    private Vegetables vegetables;
    @Inject
    private Fruit fruit;
    private boolean constructorWithParameterUsed = false;
    private static boolean disposerMethodCalled = false;
    private Fruit initializerFruit = null;
    private Fruit observerFruit = null;
    private Fruit disposerFruit = null;
    private Bread bread = new Bread(true);
    private Water water = null;
    private Vegetables wrappedEventParameter = null;
    private Vegetables wrappedDisposalParameter = null;

    private Milk observerEvent = null;
    private TropicalFruit observerParameter = null;
    private boolean observer2Used = false;

    public Grocery() {
    }

    public Grocery(@Any TropicalFruit fruit) {
        constructorWithParameterUsed = true;
    }

    public void nonInjectAnnotatedInitializer(@Any Water water) {
        this.water = water;
    }

    @Inject
    public void initializer(@Any Fruit fruit) {
        this.initializerFruit = fruit;
    }

    public String foo() {
        return "bar";
    }

    public boolean isVegetablesInjected() {
        return vegetables != null;
    }

    public Fruit getFruit() {
        return fruit;
    }

    public boolean isConstructorWithParameterUsed() {
        return constructorWithParameterUsed;
    }

    public Fruit getInitializerFruit() {
        return initializerFruit;
    }

    public Milk getMilk() {
        return new Milk(true);
    }

    public void observer1(Milk event, TropicalFruit fruit) {
        observerEvent = event;
        observerParameter = fruit;
    }

    public void observer2(@Observes Bread event) {
        observer2Used = true;
    }

    public void observerMilk(@Observes Milk milk, @Any Fruit fruit) {
        this.observerFruit = fruit;
    }

    public void observesVegetable(@Observes Vegetables vegetable) {
        wrappedEventParameter = vegetable;
    }

    @Produces
    @Cheap
    public Yogurt getYogurt(@Any TropicalFruit fruit) {
        return new Yogurt(fruit);
    }

    @Produces
    @Cheap
    public Bill createBill(@Any Fruit fruit) {
        return new Bill(fruit);
    }

    @Produces
    @Cheap
    public Vegetables createVegetable() {
        return new Carrot();
    }

    public void destroyBill(@Disposes @Cheap Bill bill, Fruit fruit) {
        disposerFruit = fruit;
    }

    public void destroyVegetable(@Disposes Vegetables vegetables) {
        wrappedDisposalParameter = vegetables;
    }

    public void destroyYogurt(Yogurt yogurt){
       disposerMethodCalled = true;
    };

    public boolean isWaterInjected() {
        return water != null;
    }

    public Milk getObserverEvent() {
        return observerEvent;
    }

    public TropicalFruit getObserverParameter() {
        return observerParameter;
    }

    public boolean isObserver2Used() {
        return observer2Used;
    }

    public Fruit getObserverFruit() {
        return observerFruit;
    }

    public Fruit getDisposerFruit() {
        return disposerFruit;
    }

    public Vegetables getWrappedEventParameter() {
        return wrappedEventParameter;
    }

    public Vegetables getWrappedDisposalParameter() {
        return wrappedDisposalParameter;
    }

    public static boolean isDisposerMethodCalled() {
        return disposerMethodCalled;
    }

}
