package localsearch.parser;

import java.io.InputStream;
import javafx.data.pull.Event;
import javafx.data.pull.PullParser;
import javafx.data.xml.QName;
import localsearch.model.Category;
import localsearch.model.Rating;
import localsearch.model.Restaurant;
import localsearch.Main;

/**
 * Sample FX Script Application for Yahoo!'s Local Search Service.
 * This version uses the PullParser API to parse results in XML.
 */

// results
var totalResultsAvailable;
var totalResultsReturned;
var firstResultPosition;

public function processResults(is: InputStream) {
    def parser = LocalSearchParser { documentType: PullParser.XML; input: is };
    parser.parse();
    is.close();
    println(Main.restaurants);
}

class LocalSearchParser extends PullParser {
    public override var onEvent = function(event: Event) {
        if (event.type == PullParser.START_ELEMENT) {
            processStartEvent()
        } else if (event.type == PullParser.END_ELEMENT) {
            processEndEvent()
        }
    }

    // temporary variables needed during processing
    var result: Restaurant;
    var category: Category;

    function processStartEvent() {
        if (event.qname.name == "ResultSet" and event.level == 0) {
            totalResultsAvailable = event.getAttributeValue(QName{name:"totalResultsAvailable"});
            totalResultsReturned = event.getAttributeValue(QName{name:"totalResultsReturned"});
            firstResultPosition = event.getAttributeValue(QName{name:"firstResultPosition"});
        } else if (event.qname.name == "Result" and event.level == 1) {
            result = Restaurant {
                id: event.getAttributeValue(QName{name:"id"}) as String;
            }
        } else if (event.qname.name == "Rating" and event.level == 2) {
            result.rating = Rating {}
        } else if (event.qname.name == "Category" and event.level == 3) {
            category = Category {}
            category.id = event.getAttributeValue(QName{name:"id"}) as String;
        }
    }

    function processEndEvent() {
        if (event.qname.name == "Result" and event.level == 1) {
            insert result into Main.restaurants;
            Main.showRestaurantDetails(0, true);
        } else if (event.qname.name == "Title" and event.level == 2) {
            result.title = event.text
        } else if (event.qname.name == "Address" and event.level == 2) {
            result.address = event.text
        } else if (event.qname.name == "City" and event.level == 2) {
            result.city = event.text
        } else if (event.qname.name == "State" and event.level == 2) {
            result.state = event.text
        } else if (event.qname.name == "Phone" and event.level == 2) {
            result.phone = event.text
        } else if (event.qname.name == "Latitude" and event.level == 2) {
            result.latitude = event.text
        } else if (event.qname.name == "Longitude" and event.level == 2) {
            result.longitude = event.text
        } else if (event.qname.name == "AverageRating" and event.level == 3) {
            result.rating.averageRating = event.text
        } else if (event.qname.name == "TotalRatings" and event.level == 3) {
            result.rating.totalRatings = event.text
        } else if (event.qname.name == "TotalReviews" and event.level == 3) {
            result.rating.totalReviews = event.text
        } else if (event.qname.name == "LastReviewDate" and event.level == 3) {
            result.rating.lastReviewDate = event.text
        } else if (event.qname.name == "LastReviewIntro" and event.level == 3) {
            result.rating.lastReviewIntro = event.text
        } else if (event.qname.name == "Distance" and event.level == 2) {
            result.distance = event.text
        } else if (event.qname.name == "Url" and event.level == 2) {
            result.url = event.text
        } else if (event.qname.name == "ClickUrl" and event.level == 2) {
            result.clickUrl = event.text
        } else if (event.qname.name == "MapUrl" and event.level == 2) {
            result.mapUrl = event.text
        } else if (event.qname.name == "BusinessUrl" and event.level == 2) {
            result.businessUrl = event.text
        } else if (event.qname.name == "BusinessClickUrl" and event.level == 2) {
            result.businessClickUrl = event.text
        } else if (event.qname.name == "Category" and event.level == 3) {
            category.value = event.text;
            insert category into result.categories;
        }
    }
}