import groovy.util.XmlParser
import org.serviio.library.metadata.*
import org.serviio.library.online.*
import groovy.json.JsonSlurper

 /********************************************************************
 * HDhomeRun plugin for Serviio
 * 

 * Version:
 *    V1: - Nov 18th, 2013 - Initial Release 
 *	  V2: - Nov 20th, 2013 - Allow channels with . 
 *	  V3: - Dec 7th, 2013 - Removed hardcoded IP and added channel number to the name 
 *	  V4: - Jan 17th, 2014 - Compatible with new firmwares with JSON, Add Favorites, Removed Unknown filter
 * Must be installed as a WebResource
 * Sample URLs: http://192.168.1.130/lineup.html
 * Sample URLs: http://192.168.1.130/lineup.json
 * Sample URLs: http://192.168.1.130/lineup.json?favorite
 ********************************************************************/
  


class HDHR extends WebResourceUrlExtractor {
    
    final VALID_FEED_URL = '^(http://)(.*?)/lineup.(html|json(.*?favorite)?)'

	
   	int getVersion() {
		return 4
	}
	
	int getExtractItemsTimeout(){
		return 30
	}
	
	WebResourceContainer errorHandlerWRC(String e){
		List<WebResourceItem> items = []
		println e
		log(e)
		items <<  new WebResourceItem(title: e, additionalInfo: ['url':'http://error','thumbnailUrl':'http://fake.jpg'])
		WebResourceContainer wrc = new WebResourceContainer(title: "Error", items: items)
		return wrc
	}
	
	void errorHandler(String e){
		println e
		log(e)
		return 
	}

    String getExtractorName() {
        return 'HDHomeRun'
    }
    
    boolean extractorMatches(URL feedUrl) {
        return feedUrl ==~ VALID_FEED_URL
    }
       
    WebResourceContainer extractItems(URL resourceUrl, int maxItemsToRetrieve) {

        List<WebResourceItem> items = []
		Date releaseDate
	    def json
		def jsMatcher
		def pageContent
		def showTitle = "HDHomeRun"

		
		//V4
		def jsMatcherLink = resourceUrl=~ VALID_FEED_URL
		
		pageContent = resourceUrl.getText()

		if (jsMatcherLink[0][3]=="html" ){ //old HTML code
			
			jsMatcher = pageContent =~ "HDHomeRun Lineup" 
			if (jsMatcher.count <= 0) {
				return errorHandlerWRC("HDHR: Channel lineup not found")
			}

			//V2
			//jsMatcher = pageContent =~ "<tr><td>(.[0-9]{1,4})</td><td>(.*)</td></tr>"
			jsMatcher = pageContent =~ "<tr><td>(.*)</td><td>(.*)</td></tr>"
				
			for  (i in 0..<jsMatcher.count){
				//if (jsMatcher[i][2] != "Unknown") {
					Map<String,String> additionalInfo = new HashMap<String, String>();
		
					
					//correction on V3
					additionalInfo.put("url","http://${jsMatcherLink[0][2]}:5004/auto/v${jsMatcher[i][1]}")
					//additionalInfo.put("thumbnailUrl",)
					items << new WebResourceItem(title: "${jsMatcher[i][1]}-${jsMatcher[i][2]}",additionalInfo: additionalInfo)
				//}
			}
		
		}else{//new JSON code
		
			jsMatcher = pageContent =~ "GuideNumber" 
			if (jsMatcher.count <= 0) {
				return errorHandlerWRC("HDHR: Channel lineup not found")
			}
			 json = new JsonSlurper().parseText(pageContent)
		
			 	for  (i in 0..<Integer.valueOf(json.result.size)){

					if (jsMatcherLink[0][4]=="?favorite" ){
						if (json[i].Tags =="favorite" ) {
							Map<String,String> additionalInfo = new HashMap<String, String>();
							additionalInfo.put("url","http://${jsMatcherLink[0][2]}:5004/auto/v${ json[i].GuideNumber}")
							items << new WebResourceItem(title: "${ json[i].GuideNumber}-${ json[i].GuideName}",additionalInfo: additionalInfo)
						}
					}else{
						Map<String,String> additionalInfo = new HashMap<String, String>();
						additionalInfo.put("url","http://${jsMatcherLink[0][2]}:5004/auto/v${ json[i].GuideNumber}")
						items << new WebResourceItem(title: "${ json[i].GuideNumber}-${ json[i].GuideName}",additionalInfo: additionalInfo)
					}
			
			}
			 
		
		}

        return new WebResourceContainer(title: showTitle, items: items)
    }

    ContentURLContainer extractUrl(WebResourceItem item, PreferredQuality requestedQuality) {
		return new ContentURLContainer(contentUrl: item.additionalInfo.url, expiresImmediately: false,live: true) 
    }
    
    static void main(args) {
        HDHR extractor = new  HDHR() 
        WebResourceContainer container = extractor.extractItems( new URL("http://192.168.1.130/lineup.json"), 5)
		
		
		if ( container ){
		
        container.getItems().each {
            ContentURLContainer result = extractor.extractUrl(it, PreferredQuality.MEDIUM)
            println result 
		}
        }   
    }
}