<apex:page controller="DreamHouseSampleDataController">
    
    <apex:slds />
    
    <html xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    
        <apex:remoteObjects >
    
            <apex:remoteObjectModel name="Bot_Command__c" jsShorthand="BotCommand">
                <apex:remoteObjectField name="Name" jsShorthand="name"/>
                <apex:remoteObjectField name="Apex_Class__c" jsShorthand="apexClass"/>
                <apex:remoteObjectField name="Pattern__c" jsShorthand="pattern"/>
                <apex:remoteObjectField name="Sample_Utterance__c" jsShorthand="sampleUtterance"/>
            </apex:remoteObjectModel>

            <apex:remoteObjectModel name="Broker__c" jsShorthand="Broker">
                <apex:remoteObjectField name="Name" jsShorthand="name"/>
                <apex:remoteObjectField name="Title__c" jsShorthand="title"/>
                <apex:remoteObjectField name="Phone__c" jsShorthand="phone"/>
                <apex:remoteObjectField name="Mobile_Phone__c" jsShorthand="mobile_phone"/>
                <apex:remoteObjectField name="Email__c" jsShorthand="email"/>
                <apex:remoteObjectField name="Picture__c" jsShorthand="picture"/>
            </apex:remoteObjectModel>
    
            <apex:remoteObjectModel name="Property__c" jsShorthand="Property">
                <apex:remoteObjectField name="Name" jsShorthand="name"/>
                <apex:remoteObjectField name="Address__c" jsShorthand="address"/>
                <apex:remoteObjectField name="City__c" jsShorthand="city"/>
                <apex:remoteObjectField name="State__c" jsShorthand="state"/>
                <apex:remoteObjectField name="Zip__c" jsShorthand="zip"/>
                <apex:remoteObjectField name="Price__c" jsShorthand="price"/>
                <apex:remoteObjectField name="Assessed_Value__c" jsShorthand="assessed"/>
                <apex:remoteObjectField name="Date_Listed__c" jsShorthand="dateListed"/>
                <apex:remoteObjectField name="Title__c" jsShorthand="title"/>
                <apex:remoteObjectField name="Beds__c" jsShorthand="bedrooms"/>
                <apex:remoteObjectField name="Baths__c" jsShorthand="bathrooms"/>
                <apex:remoteObjectField name="Status__c" jsShorthand="status"/>
                <apex:remoteObjectField name="Broker__c" jsShorthand="brokerId"/>
                <apex:remoteObjectField name="Picture__c" jsShorthand="pic"/>
                <apex:remoteObjectField name="Thumbnail__c" jsShorthand="thumb"/>
                <apex:remoteObjectField name="Tags__c" jsShorthand="tags"/>
                <apex:remoteObjectField name="Description__c" jsShorthand="description"/>
                <apex:remoteObjectField name="Location__Latitude__s" jsShorthand="lat"/>
                <apex:remoteObjectField name="Location__Longitude__s" jsShorthand="long"/>
            </apex:remoteObjectModel>
            
        </apex:remoteObjects>
        
        <body style="padding:0;margin:0">
            
        <div class="slds-scope">
            <div class="slds-page-header" role="banner">
                <div class="slds-media">
                    <div class="slds-media__figure">
                        <svg aria-hidden="true" class="slds-icon slds-icon--large slds-icon-standard-opportunity">
                            <use xlink:href="{!URLFOR($Asset.SLDS,'/assets/icons/custom-sprite/svg/symbols.svg#custom57')}"></use>
                        </svg>
                    </div>
                    <div class="slds-media__body">
                        <p class="slds-page-header__title slds-truncate slds-align-middle" title="DreamHouse Sample Data">DreamHouse Sample Data</p>
                        <p class="slds-text-body--small slds-page-header__info">Sample data for the DreamHouse Application</p>
                    </div>
                </div>
            </div>
            <div id="content" style="margin:20px">
                <div style="padding-bottom:20px">Click the button below to iinitialize the Property, Broker, Favorite, and Bot Command objects with sample data.
                    <div style="color:red">All existing records in these objects will be deleted.</div>
                </div>
                <button class="slds-button slds-button--brand" onclick="initialize()">Initialize Sample Data</button>
            </div>
            
            <div id="spinner" class="slds-spinner_container" style="display:none">
              <div class="slds-spinner slds-spinner--large" role="alert">
                <span class="slds-assistive-text">Loading</span>
                <div class="slds-spinner__dot-a"></div>
                <div class="slds-spinner__dot-b"></div>
              </div>
            </div>
            
        </div>
        
        <script>
    
        function getRandomNumber(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
            
        var brokers = [
            {
                name: "Caroline Kingsley",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "caroline@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/caroline_kingsley.jpg"
            },
            {
                name: "Michael Jones",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "michael@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/michael_jones.jpg"
            },
            {
                name: "Jonathan Bradley",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "jonathan@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/jonathan_bradley.jpg"
            },
            {
                name: "Jennifer Wu",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "jen@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/jennifer_wu.jpg"
            },
            {
                name: "Olivia Green",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "olivia@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/olivia_green.jpg"
            },
            {
                name: "Miriam Aupont",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "miriam@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/miriam_aupont.jpg"
            },
            {
                name: "Michelle Lambert",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "michelle@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/michelle_lambert.jpg"
            },
            {
                name: "Victor Ochoa",
                title: "Senior Broker",
                phone: "617-244-3672",
                mobile_phone: "617-244-3672",
                email: "victor@dreamhouse.demo",
                picture: "https://s3-us-west-1.amazonaws.com/sfdc-demo/people/victor_ochoa.jpg"
            }
		];
    
        var properties = [
          {
            address: "18 Henry st",
            city: "Cambridge",
            state: "MA",
            zip: "01742",
            price: 975000,
            title: "Stunning Colonial",
            bedrooms: 4,
            bathrooms: 3,
            long: -71.11095,
            lat: 42.35663,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house01.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house01sq.jpg",
            tags: "colonial",  
            description: "Lorem ipsum dolor sit amet",
            broker: 0
          },
          {
            address: "24 Pearl st",
            city: "Cambridge",
            state: "MA",
            zip: "02420",
            price: 1200000,
            title: "Ultimate Sophistication",
            bedrooms: 5,
            bathrooms: 4,
            long: -71.10869,
            lat: 42.359103,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house02.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house02sq.jpg",
            tags: "colonial",  
            description: "Lorem ipsum dolor sit amet",
            broker: 1
          },
          {
            address: "61 West Cedar st",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 825000,
            title: "Modern City Living",
            bedrooms: 5,
            bathrooms: 4,
            long: -71.070061,
            lat: 42.359986,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house03.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house03sq.jpg",
            tags: "contemporary",  
            description: "Lorem ipsum dolor sit amet",
            broker: 2
          },
          {
            address: "32 Prince st",
            city: "Cambridge",
            state: "MA",
            zip: "02420",
            price: 930000,
            title: "Stunning Victorian",
            bedrooms: 5,
            bathrooms: 4,
            long: -71.110448,
            lat: 42.360642,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house04.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house04sq.jpg",
            tags: "victorian",  
            description: "Lorem ipsum dolor sit amet",
            broker: 3
          },
          {
            address: "211 Charles Street",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 850000,
            title: "Waterfront in the City",
            bedrooms: 3,
            bathrooms: 2,
            long: -71.084454,
            lat: 42.368168,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house05.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house05sq.jpg",
            tags: "contemporary",  
            description: "Lorem ipsum dolor sit amet",
            broker: 4
          },
          {
            address: "448 Hanover st",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 725000,
            title: "Quiet Retreat",
            bedrooms: 4,
            bathrooms: 2,
            long: -71.052617,
            lat: 42.366855,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house06.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house06sq.jpg",
            tags: "colonial",  
            description: "Lorem ipsum dolor sit amet",
            broker: 5
          },
          {
            address: "127 Endicott st",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 450000,
            title: "City Living",
            bedrooms: 3,
            bathrooms: 1,
            long: -71.057352,
            lat: 42.365003,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house07.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house07sq.jpg",
            tags: "colonial",  
            description: "Lorem ipsum dolor sit amet",
            broker: 6
          },
          {
            address: "48 Brattle st",
            city: "Cambridge",
            state: "MA",
            zip: "02420",
            price: 450000,
            title: "Heart of Harvard Square",
            bedrooms: 5,
            bathrooms: 4,
            long: -71.121653,
            lat: 42.374117,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house10.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house10sq.jpg",
            tags: "victorian",  
            description: "Lorem ipsum dolor sit amet",
            broker: 7
          },
          {
            address: "121 Harborwalk",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 450000,
            title: "Seaport District Retreat",
            bedrooms: 3,
            bathrooms: 3,
            long: -71.049327,
            lat: 42.35695,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house09.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house09sq.jpg",
            tags: "contemporary",  
            description: "Lorem ipsum dolor sit amet",
            broker: 0
          },
          {
            address: "503 Park Drive",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 650000,
            title: "City Living",
            bedrooms: 2,
            bathrooms: 2,
            long: -71.105475,
            lat: 42.347400,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house08.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house08sq.jpg",
            tags: "contemporary",  
            description: "Lorem ipsum dolor sit amet",
            broker: 1
          },
          {
            address: "95 Gloucester st",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 690000,
            title: "Architectural Details",
            bedrooms: 3,
            bathrooms: 3,
            lat: 42.349693,
            long: -71.084407,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house11.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house11sq.jpg",
            tags: "contemporary",  
            description: "Lorem ipsum dolor sit amet",
            broker: 0
          },
          {
            address: "145 Commonwealth ave",
            city: "Boston",
            state: "MA",
            zip: "02420",
            price: 845000,
            title: "Luxury Redefined",
            bedrooms: 4,
            bathrooms: 3,
            lat: 42.352466,
            long: -71.075311,
            pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house12.jpg",
            thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/house12sq.jpg",
            tags: "colonial",  
            description: "Lorem ipsum dolor sit amet",
            broker: 1
          },
            {
                address: "24 Euston St",
                city: "Brookline",
                state: "MA",
                zip: "02446",
                price: 690000,
                title: "Historical Victorian",
                bedrooms: 5,
                bathrooms: 3,
                lat: 42.348087,
                long: -71.109131,
                pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian01.jpg",
                thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian01sq.jpg",
                tags: "victorian",  
                description: "Lorem ipsum dolor sit amet",
                broker: 2
            },
            {
                address: "650 Kendall St",
                city: "Cambridge",
                state: "MA",
                zip: "02142",
                price: 730000,
                title: "Unique Victorian",
                bedrooms: 6,
                bathrooms: 4,
                lat: 42.364772,
                long: -71.080640,
                pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian02.jpg",
                thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian02sq.jpg",
                tags: "victorian",  
                description: "Lorem ipsum dolor sit amet",
                broker: 3
            },
            {
                address: "252 Charles St",
                city: "Cambridge",
                state: "MA",
                zip: "02141",
                price: 790000,
                title: "One of a kind",
                bedrooms: 7,
                bathrooms: 3,
                lat: 42.368269,
                long: -71.085920,
                pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian03.jpg",
                thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian03sq.jpg",
                tags: "victorian",  
                description: "Lorem ipsum dolor sit amet",
                broker: 4
            },
            {
                address: "105 Brattle St",
                city: "Cambridge",
                state: "MA",
                zip: "02138",
                price: 950000,
                title: "Location Location!",
                bedrooms: 5,
                bathrooms: 5,
                lat: 42.376511,
                long: -71.126194,
                pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian06.jpg",
                thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian06sq.jpg",
                tags: "victorian",  
                description: "Lorem ipsum dolor sit amet",
                broker: 5
            },
            {
                address: "223 Huron Ave",
                city: "Cambridge",
                state: "MA",
                zip: "02138",
                price: 850000,
                title: "Recently Updated",
                bedrooms: 4,
                bathrooms: 3,
                lat: 42.381437,
                long: -71.132681,
                pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian07.jpg",
                thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian07sq.jpg",
                tags: "victorian",  
                description: "Lorem ipsum dolor sit amet",
                broker: 6
            },
            {
                address: "30 Peterborough St",
                city: "Boston",
                state: "MA",
                zip: "02215",
                price: 650000,
                title: "Character and Details",
                bedrooms: 5,
                bathrooms: 4,
                lat: 42.343890,
                long: -71.096371,
                pic: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian04.jpg",
                thumb: "https://s3-us-west-1.amazonaws.com/sfdc-demo/realty/victorian04sq.jpg",
                tags: "victorian",  
                description: "Lorem ipsum dolor sit amet",
                broker: 0
            }
            
        ];
            
		var botCommands = [
            {
                name: "Find Account",
                apexClass: "HandlerFindAccount",
                pattern: "(?i).*account ([A-Za-z0-9]*)",
                sampleUtterance: "Account United"
			},
            {
                name: "Find Contact",
                apexClass: "HandlerFindContact",
                pattern: "(?i).*contact ([A-Za-z0-9]*)",
                sampleUtterance: "Contact jo"
			},
            {
                name: "Find House",
                apexClass: "HandlerFindProperties",
                pattern: "(?i)find house",
                sampleUtterance: "Find house"
			},
            {
                name: "Find Properties by Bedrooms",
                apexClass: "HandlerFindPropertiesByBedrooms",
                pattern: "(?i)([0-9]*) bedrooms in ([A-Za-z]*)",
                sampleUtterance: "3 bedrooms in Boston"
			},
            {
                name: "Help",
                apexClass: "HandlerHelp",
                pattern: "(?i)help",
                sampleUtterance: "Help"
			},
            {
                name: "My Open Cases",
                apexClass: "HandlerMyOpenCases",
                pattern: "(?i).*open cases.*",
                sampleUtterance: "My Open Cases"
			},
            {
                name: "Pipeline",
                apexClass: "HandlerPipeline",
                pattern: "(?i).*pipeline.*",
                sampleUtterance: "My Pipeline"
			},
            {
                name: "Quarter",
                apexClass: "HandlerQuarter",
                pattern: "(?i).*quarter.*",
                sampleUtterance: "My Quarter"
			},
            {
                name: "SOQL",
                apexClass: "HandlerSOQL",
                pattern: "(?i)select.*",
                sampleUtterance: "SELECT Name FROM Contact LIMIT 5"
			},
            {
                name: "Top Opportunities",
                apexClass: "HandlerTopOpportunities",
                pattern: "(?i).*top (\d+) opportunities",
                sampleUtterance: "Top 3 opportunities"
			},
            {
                name: "Travel Approval",
                apexClass: "HandlerTravelApproval",
                pattern: "(?i)travel approval",
                sampleUtterance: "Travel Approval"
			},
            {
                name: "Image search",
                apexClass: "HandlerImageBasedSearch",
                pattern: "(?i)search houses like this",
                sampleUtterance: "search houses like this"
			},
            {
                name: "File Upload",
                apexClass: "HandlerFileUpload",
                pattern: "(?i)upload",
                sampleUtterance: "upload"
			},
            
		];
    
        function initialize() {
            // Delete all existing brokers and properties
            Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.DreamHouseSampleDataController.deleteAll}', 
                function(result, event) {
                    if (event.status) {
                        loadRecords();
                    } else {
                        alert("Something went wrong deleting existing records");
                    }
                });
        }
        
        function loadRecords() {
            var promises = [];
            showSpinner(true);
            for (var i=0; i<brokers.length; i++) {
                promises.push(createBroker(i));
            }
            for (var j=0; j<botCommands.length; j++) {
                promises.push(createBotCommand(j));
            }
            Promise.all(promises).then(
                function() {
                    showSpinner(false);
                    showStatus("Successfully imported " + properties.length + " properties, " + brokers.length + " brokers, and " + botCommands.length + " bot commands");    
                },
                function(error) {
                    showSpinner(false);
                    showStatus("A problem has occurred. " + error);
                });
        }
            
        function createBroker(index) {
            return new Promise(function(resolve, reject) {
                var brokerRO = new SObjectModel.Broker();
                brokerRO.create(brokers[index], function(err, brokerId) {
                    if (err) {
                        reject(err);
                    } else {
                        var propertyCreatePromises = [];
                        for (var j=0; j<properties.length; j++) {
                            if (properties[j].broker == index) {
                                properties[j].name = properties[j].address; 
                                properties[j].status = "Available"; 
                                properties[j].brokerId = brokerId[0];
                                properties[j].assessed = properties[j].price * getRandomNumber(65, 90) / 100;
                                properties[j].dateListed = new Date(new Date() - getRandomNumber(3, 50) * 86400000);
                                delete properties[j].broker; 
                                propertyCreatePromises.push(createProperty(properties[j]));
                            }
                        }
                        Promise.all(propertyCreatePromises).then(resolve, reject);
                    }
                });
            });
        }            
                
        function createBotCommand(index) {
            return new Promise(function(resolve, reject) {
                var botCommandRO = new SObjectModel.BotCommand();
                botCommandRO.create(botCommands[index], function(err, botCommandId) {
                    if (err) {
                        reject(err);
                    } else {
						resolve();
                    }
                });
            });
        }            

		function createProperty(property) {
            return new Promise(function(resolve, reject) {
                var propertyRO = new SObjectModel.Property();
                propertyRO.create(property, function(err, propertyId) {
                    if (err) {
                        reject(err)
                    } else {
                        resolve(propertyId);
                    }
                });
            });
        }  
            
        function showSpinner(visible) {
            document.getElementById("spinner").style.display = visible ? "inline" : "none";
        }

        function showStatus(status) {
            setTimeout(function() {
                alert(status);
            });
        }
            
        </script>
        </body>
    </html>    
</apex:page>