/*
 * Copyright 2009 Niclas Hedhman.
 *
 * 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.apache.zest.sample.rental.domain.dev;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import org.apache.zest.api.composite.TransientComposite;
import org.apache.zest.api.injection.scope.Structure;
import org.apache.zest.api.mixin.Mixins;
import org.apache.zest.api.unitofwork.UnitOfWork;
import org.apache.zest.api.unitofwork.UnitOfWorkCompletionException;
import org.apache.zest.api.unitofwork.UnitOfWorkFactory;
import org.apache.zest.api.value.ValueBuilder;
import org.apache.zest.api.value.ValueBuilderFactory;
import org.apache.zest.sample.rental.domain.Car;
import org.apache.zest.sample.rental.domain.Customer;
import org.apache.zest.sample.rental.domain.Period;
import org.apache.zest.sample.rental.domain.RentalShop;
import org.apache.zest.sample.rental.web.DataInitializer;

@Mixins( InitialData.Mixin.class )
public interface InitialData
    extends DataInitializer, TransientComposite
{
    abstract class Mixin
        implements DataInitializer
    {
        @Structure
        UnitOfWorkFactory uowf;
        @Structure
        ValueBuilderFactory vbf;
        private ArrayList<Customer> customers = new ArrayList<Customer>();
        private ArrayList<Car> cars = new ArrayList<Car>();

        public void initialize()
            throws Exception
        {
            UnitOfWork uow = uowf.newUnitOfWork();
            try
            {
                RentalShop shop = createShop( uow );
                createCustomers( shop );
                createCars( shop );
                createBookings( shop );
                uow.complete();
            }
            finally
            {
                uow.discard();
            }
        }

        private void createBookings( RentalShop shop )
        {
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
            shop.book( findRandomCustomer(), findRandomCar(), createRandomPeriod() );
        }

        private Period createRandomPeriod()
        {
            Calendar cal = Calendar.getInstance();
            cal.setTime( new Date() );
            cal.add( Calendar.DATE, Math.abs( (int) ( Math.random() * 5.0 ) ) );
            cal.set( Calendar.HOUR_OF_DAY, 15 );
            cal.set( Calendar.MINUTE, 0 );
            cal.set( Calendar.SECOND, 0 );
            Date earliestPickup = cal.getTime();

            cal.add( Calendar.DATE, Math.abs( (int) ( Math.random() * 30.0 ) ) );
            cal.set( Calendar.HOUR_OF_DAY, 12 );
            cal.set( Calendar.MINUTE, 0 );
            cal.set( Calendar.SECOND, 0 );
            Date latestReturn = cal.getTime();
            ValueBuilder<Period> builder = vbf.newValueBuilder( Period.class );
            builder.prototype().startOfPeriod().set( earliestPickup );
            builder.prototype().endOfPeriod().set( latestReturn );
            return builder.newInstance();
        }

        private Car findRandomCar()
        {
            int index = (int) Math.floor( cars.size() * Math.random() );
            return cars.get( index );
        }

        private Customer findRandomCustomer()
        {
            int index = (int) Math.floor( customers.size() * Math.random() );
            return customers.get( index );
        }

        private void createCars( RentalShop shop )
        {
            Car car;
            car = shop.createCar( "SUV", "Volvo XC90", "WHO 7878" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "SUV", "BMW X5", "WIT 23" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "SUV", "Volvo XC90", "WHO 7879" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "SUV", "Volvo XC90", "WHO 7880" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "SUV", "BMW X5", "WIT 24" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "SUV", "BMW X5", "WIT 25" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "SUV", "BMW X5", "WIT 26" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "SUV", "BMW X5", "WIT 27" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Compact", "Mini Cooper S", "WMY 40" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Compact", "Mini Cooper S", "WMY 41" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Compact", "Mini Cooper S", "WMY 42" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Compact", "Mini Cooper S", "WMY 43" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Compact", "Mini Cooper S", "WMY 44" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Compact", "Mini Cooper S", "WMY 45" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Sedan", "BMW 318i", "WRY 900" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Sedan", "BMW 318i", "WRY 901" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
            car = shop.createCar( "Sedan", "BMW 318i", "WRY 902" );
            shop.boughtCar( car, new Date() );
            cars.add( car );
        }

        private RentalShop createShop( UnitOfWork uow )
            throws UnitOfWorkCompletionException
        {
            return uow.newEntity( RentalShop.class, "SHOP" );
        }

        private void createCustomers( RentalShop shop )
        {
            customers.add( shop.createCustomer( "Niclas Hedhman", "344-28-2, Vista Damai", "Jalan Tun Razak", "50400", "Kuala Lumpur", "Malaysia" ) );
            customers.add( shop.createCustomer( "Peter Neubauer", "Sovstaden 24", "", "21212", "Malm�", "Sweden" ) );
            customers.add( shop.createCustomer( "Rickard �berg", "GpsFree 123", "Bukit Antarabangsa", "68000", "Ampang", "Malaysia" ) );
            customers.add( shop.createCustomer( "Mickey Mouse", "Playhouse 1", "", "1234", "Disneyland", "USA" ) );
            customers.add( shop.createCustomer( "Michael Hunger", "Jederstrasse 1", "", "78787", "Dresden", "Germany" ) );
            customers.add( shop.createCustomer( "Emil Eifrem", "Freeze Street 12", "WhereWindBlows", "23456", "Malm�", "Sweden" ) );
        }
    }
}
