mock entitymodel for ${{BASIC_PROJECT_NAME}}.entities.* {
    import ${{BASIC_PROJECT_NAME}}.datainterchange.*

	datainterchanges {
    	datainterchange import Warehouses from file "file://${{PROJECT_LOC}}/../${{BASIC_PROJECT_NAME}}.model.datainterchange/models/smooksresources/warehouses.xml"
	}
    
    resources {

		resource GenderResources {
			attributes (flag, description)
			items {
				MALE   ( "M" "male" )
				FEMALE ( "F" "female" )
			}
		}

        resource CountryResources {
            attributes (native_name)
            items {
                DE ( "Deutschland" )
                FR ( "France" )
                UK ( "Great Britain" )
            }
        }
        
        resource CompanyRelationResources {
            attributes (name, description)
            items {
                SUPPLIER ( "supplier", "delivering interesting goods" )
                CUSTOMER ( "customer", "buying our interesting goods" )
            }
        }

        resource CurrencyResources {
            attributes (code description)
            items {
                USD	( "USD" "Dollar" )
                EUR ( "EUR" "Euro" )
            }
        }

        resource MonthResources {
            items {
                JANUARY
                FEBRUARY
                MARCH
                APRIL
                MAY
                JUNE
                JULY
                AUGUST
                SEPTEMBER
                OCTOBER
                NOVEMBER
                DECEMBER
            }
        }
    }
    
    objects {
        
        /** containing consistent information for a postal address */
        object AddressObject {
            /** ISO-3166-Alpha-2-Code */
            var iso3166 by enum CountryResources
            var street switch on iso3166 {
                when DE ( "Berlinerplatz ##", "Münchnerstr. ##", "[never]EverStrasse 9" )
                when FR ( "Arc de Truimphe ##" )
                when UK ( "Paddington Street ##" "Willington Road ##" )
            }
            var state_province switch on iso3166 {
                when DE ( "Baden-Württemberg" "Rheinland-Pfalz" "Niedersachsen" )
                when FR ( "Acquitaine" "Centre" "Burgund" "Paris" )
                when UK ( "East" "East Midlands" "London" "North East" )
            }
            var postalcode ( "#####" )
            var city switch on iso3166 {
                when DE ( "Berlin" "Buxtehude" "Darmstadt" "Karlsruhe" "München" )
                when FR ( "Paris" )
                when UK ( "Belfast" "Cardiff" "Lonon" )
            }
            var country with iso3166.native_name
            var phonenumber switch on iso3166 {
                when DE ( "+49 (###) ####-###" )
                when FR ( "+33 (###) ####-###" )
                when UK ( "+44 (###) ####-###" )
            }
            var alphabet switch on iso3166 {
                when DE ( "abcdefghijklmnopqrstuvwxyzäöüß" )
                when FR ( "abcdefghijklmnopqrstuvwxyzáàâéè" )
                when UK ( "abcdefghijklmnopqrstuvwxyz" )
            }
        }
 
        /** containing consistent information about a company */
        object CompanyObject {
            embed company_address 	defined as AddressObject
            var companyDomain 		( "com" "org" )
            var companyName 		( "Alist" "Beans" "Klein" )
            var companySuffix 		( "AG" "GmbH" "KoKG" )
            var companyEmail 		( "info" "kontakt" )
            var name 				( "[companyName] [companySuffix]" )
            var email 				( "[companyEmail]@[companyName].[companyDomain]" )
            var position_title 		( "Store Manager" "HQ Finance" "Store Permanent Checker" )
        }
        
        /** containing consistent information about a department */
        object DepartmentObject {
            embed department_address	defined as AddressObject
            var name 					( "Einkauf" "Lohnbuchhaltung" "Verkauf" "Zentrale" )
            var default_yearly_income 	randomize unsigned double in range 10000.0 up to and including 30000.0 with 2 decimals round to 500.0
        }
        
        /** containing consistent information about a currencies */
        object CurrencyObject {
        	var currencies	by enum CurrencyResources
        	var code		with currencies.code
        	var description	with currencies.description
        }
        
        object ValueBeanObject {
        	var amount		randomize unsigned double in range 2000.0 up to and including 130000.0 with 2 decimals round to 500.0
        	embed currency	defined as CurrencyObject
        }
        
        /** containing consistent information about a person */
        object PersonObject {
			var sex					by enum GenderResources
            var marital				by enum MaritalStatus
            var gender				with sex.flag
            var marital_status		with marital
            var firstName			switch on sex {
                when MALE			( "Andreas" "Armin" "Ernst" "Hans" "Hubert" "Jens" "Johan" "Michael" "Norbert" "Oliver" "Thorsten" "Ulrich" )
                when FEMALE			( "Andrea" "Evelin" "Jutta" "Maria" )
            }
            var lastName			( "Abbott" "Collins" "Hammond" "Maynard" "Schultz" "Swanson" "Watson" "Zimmerman" )
            var fullName			( "[firstName] [lastName]" )
            var mailProvider		( "gmail.de" "yahoo.de" "mail.de" )
            var privateEmail		( "[firstName].[lastName]@[mailProvider]" )
            embed home_address		defined as AddressObject
            embed employer			defined as CompanyObject
            var education_level		( "Bachelors Degree" "Partial College" "Graduate Degree" "High School Degree" )
            var birth_date			randomize date in range -50 up to and including -20 years
            var yearly_income		randomize unsigned double in range 10000.0 up to and including 30000.0 with 2 decimals round to 500.0
            var num_cars_owned		randomize signed integer from (3 8 11)
            var age					randomize signed integer in range 17 up to and including 90
			var trendIndex			randomize signed double in range -10 up to and including 10 with 2 decimals
			var goalReachedPercent	randomize signed double in range 0 up to and including 100 with 2 decimals
            var nativeGerman		randomize boolean
            var portrait			switch on sex {
                when MALE (
                    "dacf6830-d36b-422d-9cc5-d981f27c49c1" // Boss
                    "803c55a5-9bbb-402c-9d15-a2fde19f369d" // Employee9
                    "b2e3cab2-22ed-45e9-ad6a-af0e54054177" // Employee16
                    "ce1f20d4-b962-46df-acb7-5558561800b2" // Employee18
                )
                when FEMALE (
                    "b01c3e47-8226-43ce-88e2-6e93b3991f06" // Employee2
                    "976a9cd2-1859-47e3-9f2c-83e0f9e2f0ae" // Employee3
                    "0dc1064b-c09d-400c-9159-1909798cd9f8" // Employee6
                    "0051e81f-c2c9-432a-b0d9-0cf065dfee49" // Employee7
                    "8a5f20be-77bc-4e57-a5ea-5bdf37a948c4" // Employee8
                    "9d5b6d6f-515a-4ee2-8000-593e026aa248" // Employee10
                    "f00e8c41-8fe5-4a4f-9c29-a36ace86eafa" // Employee11
                    "970c6257-9441-4f3f-aeea-4d5c31f83acf" // Employee14
                    "4d2e2844-7be3-4870-b09c-e95e466565e9" // Employee15
                    "1a074db7-5e6c-4022-a054-17a959678229" // Employee17
                    "e24a0980-9724-494f-afba-a1c0b7cb64b8" // Employee20
                    "8ba871b4-bc07-4608-a0fb-7aa47620525b" // Employee21
                    "c6d42a81-a798-420b-90de-9fd0f80f5515" // Employee23
                    "96f5fdd0-6e94-4ac9-b8d1-8771196bee38" // Employee26
                )
            }
            var expenses_for_cars	calculate as double based on (String gender, int num_cars_owned) {
            	var result = 0.0;
            	if	("M".equals(gender)) {
            		result = num_cars_owned * 123.45
            	}
            	else {
            		result = 999.99
            	}
            	return result
            }
        }
    }
    
    mock entities {

		mocking mockDailies for entity Dailies iterate theDate with date from 2016-01-01 until yesterday every 1 days {
			var dayOfMonth	calculate based on (theDate) {
				return theDate.getDate
			}
			var monthOfYear	calculate based on (theDate) {
				return theDate.month+1
			}
			var theYear		calculate based on (theDate) {
				return theDate.year+1900
			}
			var quarter		calculate based on (theDate) {
				return "Q"+(1+((theDate.month / 3) as int))
			}
			var theDay		calculate based on (theDate) {
				return new java.text.SimpleDateFormat("E").format(theDate)
			}
			var theMonth	calculate based on (theDate) {
				return new java.text.SimpleDateFormat("M").format(theDate)
			}
			var weekOfYear	calculate based on (theDate) {
				return Integer.parseInt(new java.text.SimpleDateFormat("w").format(theDate))
			}
		}

        mocking mockedCompanyRelation for entity CompanyRelationType by resource CompanyRelationResources {
            var name		as name
            var description as description
        }

        mocking mockedCompanyGroup for entity CompanyGroup rows 2 to 5 {
            temporary groupData	by object CompanyObject
            var name			as groupData.companyName
            var description		randomize sentences 5
        }

        mocking mockedCompany for entity Company rows 5 to 10 {
            temporary companyData	by object CompanyObject
            ref company_group		to mockedCompanyGroup
            var name				as companyData.companyName
            var description			randomize sentences 5
            ref relation_type		to mockedCompanyRelation
        }

        mocking mockedDepartment for entity Department rows 10 to 20 {
            temporary departmentData	by object DepartmentObject
            ref company					to mockedCompany
            var name					as departmentData.name
            var description				randomize sentences 5
            var default_yearly_income	as departmentData.default_yearly_income
        }
        
        mocking currency for entity Currency by resource CurrencyResources {
        	var code		as code
        	var description	as description
        }
        
        mocking mockedPerson for entity Person rows 20 to 50 {
            temporary personData					by object PersonObject
            var first_name							as personData.firstName
            var last_name							as personData.lastName
            var marital_status						as personData.marital_status
            var gender								as personData.gender
            var birthdate							as personData.birth_date
            var education							as personData.education_level
            /** only 70% of all persons are employees, the other 30% are individuals */
            ref department to mockedDepartment		optional for 70 percent
            var position							as personData.employer.position_title
            var portrait							as personData.portrait
            var num_cars_owned						as personData.num_cars_owned
            var expenses_for_cars					as personData.expenses_for_cars
            var yearly_income						as personData.yearly_income
            var age									as personData.age
			var trendIndex							as personData.trendIndex
			var goalReachedPercent					as personData.goalReachedPercent
            var nativeGerman						as personData.nativeGerman
            ref warehouse							to existing entities optional for 80 percent
            var percentual_diff_to_default	calculate based on (yearly_income, department.default_yearly_income) {
                return yearly_income / department__default_yearly_income
            }
        }
        
        mocking mockedPersonInfo for entity PersonInfo rows 10 to 100 {
            ref person	to mockedPerson
            var message	randomize sentences 10
        }
        
        mocking mockedAddress for entity Address rows 20 to 100 {
            temporary addressData	by object AddressObject
            ref company				to mockedCompany optional for 10 percent
            ref department			to mockedDepartment optional for 20 percent
            ref person				to mockedPerson optional for 70 percent
            var address1			as addressData.street
            var city				as addressData.city
            var state_province		as addressData.state_province
            var country				as addressData.country
            var postal_code			as addressData.postalcode
        }
    }
}