/**
 * 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.camel.component.timer;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.camel.ContextTestSupport;
import org.apache.camel.Endpoint;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.JndiRegistry;

public class TimerReferenceConfigurationTest extends ContextTestSupport {

    /**
     * reference params
     */
    final String refExpectedTimeString = "1972-12-11 19:55:00";
    final String refExpectedPattern = "yyyy-MM-dd HH:mm:ss";
    final long refExpectedPeriod = 500;
    final long refExpectedDelay = 100;
    final boolean refExpectedFixedRate = true;
    final boolean refExpectedDaemon = false;
    final long refExpectedRepeatCount = 11;

    /**
     * value params
     */
    final String valExpectedTimeString = "1970-04-17T18:07:41";
    final String valExpectedPattern = "yyyy-MM-dd'T'HH:mm:ss";
    final long valExpectedPeriod = 350;
    final long valExpectedDelay = 123;
    final boolean valExpectedFixedRate = false;
    final boolean valExpectedDaemon = true;
    final long valExpectedRepeatCount = 13;

    final String refTimerUri = "timer://passByRefTimer?"
            + "time=#refExpectedTimeString"
            + "&pattern=#refExpectedPattern"
            + "&period=#refExpectedPeriod"
            + "&delay=#refExpectedDelay"
            + "&fixedRate=#refExpectedFixedRate"
            + "&daemon=#refExpectedDaemon"
            + "&repeatCount=#refExpectedRepeatCount";

    final String valueTimerUri = "timer://passByValueTimer?"
            + "time=" + valExpectedTimeString
            + "&pattern=" + valExpectedPattern
            + "&period=" + valExpectedPeriod
            + "&delay=" + valExpectedDelay
            + "&fixedRate=" + valExpectedFixedRate
            + "&daemon=" + valExpectedDaemon
            + "&repeatCount=" + valExpectedRepeatCount;

    final String mockEndpointUri = "mock:result";

    @Override
    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry reg = super.createRegistry();
        reg.bind("refExpectedTimeString", refExpectedTimeString);
        reg.bind("refExpectedPattern", refExpectedPattern);
        reg.bind("refExpectedPeriod", refExpectedPeriod);
        reg.bind("refExpectedDelay", refExpectedDelay);
        reg.bind("refExpectedFixedRate", refExpectedFixedRate);
        reg.bind("refExpectedDaemon", refExpectedDaemon);
        reg.bind("refExpectedRepeatCount", refExpectedRepeatCount);
        return reg;
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from(refTimerUri).to(mockEndpointUri);
                from(valueTimerUri).to(mockEndpointUri);
            }
        };
    }

    /**
     * Test that the reference configuration params are correct
     *
     * @throws Exception
     */
    public void testReferenceConfiguration() throws Exception {

        Endpoint e = context.getEndpoint(refTimerUri);
        TimerEndpoint timer = (TimerEndpoint) e;
        final Date expectedTimeObject = new SimpleDateFormat(refExpectedPattern).parse(refExpectedTimeString);
        final Date time = timer.getTime();
        final long period = timer.getPeriod();
        final long delay = timer.getDelay();
        final boolean fixedRate = timer.isFixedRate();
        final boolean daemon = timer.isDaemon();
        final long repeatCount = timer.getRepeatCount();

        assertEquals(refExpectedDelay, delay);
        assertEquals(refExpectedPeriod, period);
        assertEquals(expectedTimeObject, time);
        assertEquals(refExpectedFixedRate, fixedRate);
        assertEquals(refExpectedDaemon, daemon);
        assertEquals(refExpectedRepeatCount, repeatCount);
    }

    /**
     * Test that the 'value' configuration params are correct
     *
     * @throws Exception
     */
    public void testValueConfiguration() throws Exception {
        Endpoint e = context.getEndpoint(valueTimerUri);
        TimerEndpoint timer = (TimerEndpoint) e;
        final Date expectedTimeObject = new SimpleDateFormat(valExpectedPattern).parse(valExpectedTimeString);
        final Date time = timer.getTime();
        final long period = timer.getPeriod();
        final long delay = timer.getDelay();
        final boolean fixedRate = timer.isFixedRate();
        final boolean daemon = timer.isDaemon();
        final long repeatCount = timer.getRepeatCount();

        assertEquals(valExpectedDelay, delay);
        assertEquals(valExpectedPeriod, period);
        assertEquals(expectedTimeObject, time);
        assertEquals(valExpectedFixedRate, fixedRate);
        assertEquals(valExpectedDaemon, daemon);
        assertEquals(valExpectedRepeatCount, repeatCount);
    }

}
