/*
 * Copyright 2010 JBoss Inc
 *
 * 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.
 */

/*
 Original source
 https://github.com/droolsjbpm/drools/blob/master/drools-examples/
 http://docs.jboss.org/drools/
*/
package com.example.ace

import java.math.BigDecimal
import function my.package.Foo.hello

declare FactType
  @author( Bob )
  id : String
  name : String @maxLength(100) @notnull

  value : BigDecimal
end

declare FactType2 extends AnotherType
end

declare trait TraitType extends com.package.AnotherType
end


declare trait GoldenCustomer
    balance : long @Alias( "org.acme.foo.accountBalance" )
end

global org.slf4j.Logger logger

/**
 * @param name who we'll salute?
 */
function String hello(String name) {
    return "Hello "+name+"!";
}

rule "Trim all strings"
  dialect "java"
  no-loop
when // fdsfds
  $s : String(a == null || == "empty", $g : size)
  Cheese( name matches "(Buffalo)?\\S*Mozarella" )
    CheeseCounter( cheeses contains $var ) // contains with a variable
    CheeseCounter( cheese memberof $matureCheeses )
    Cheese( name soundslike 'foobar' )
    Message( routingValue str[startsWith] "R1" )
    Cheese( name in ( "stilton", "cheddar", $cheese ) )
    Person( eval( age == girlAge + 2 ), sex = 'M' )
then
  /**
   * TODO There mus be better way
   */
  retract($s);
  String a = "fd";
  a.toString();

  insert($s.trim());
end

query isContainedIn( String x, String y )
  Location( x, y; )
  or
  ( Location( z, y; ) and isContainedIn( x, z; ) )
end

rule "go" salience 10
when
    $s : String(  )
then
    System.out.println( $s );
end

rule "When all English buses are not red"
when
    not(forall( $bus : Bus( nationality == 'english')
                Bus( this == $bus, color = 'red' ) ))
then
    // What if all english buses are not red?
end

rule "go1"
when
    String( this == "go1" )
    isContainedIn("Office", "House"; )
then
    System.out.println( "office is in the house" );
end

rule "go2"
when
    String( this == "go2" )
    isContainedIn("Draw", "House"; )
then
    System.out.println( "Draw in the House" );
end

/**
 * Go Right
 */
rule GoRight dialect "mvel"  salience (Math.abs( $df.colDiff ))  when
    $df   : DirectionDiff(colDiff > 0 )
    $target : Cell(  row == $df.row, col == ($df.col + 1) )
    CellContents( cell == $target, cellType != CellType.WALL )
    not Direction(character == $df.fromChar, horizontal == Direction.RIGHT )
then
    System.out.println( "monster right" );
    retract( $df );
    insert( new Direction($df.fromChar, Direction.RIGHT, Direction.NONE ) );
end
