#!/usr/bin/python

import sys
import getopt
import urllib
import re
import string

SFGateOpenHousesPageFetcher_initialQueryUrl = "http://realestate.sfgate.com/RealEstate/openhouses/SearchResults.asp?RoS=S&RegionIds=14&RegionIdCount=1&SaveField=&NewLflag=&BRooms=60&LPrice=750000&HPrice=1500000&BType=0&Amenities=0&cid=999&SCountyId=0&AdTagCountyId=&sRegionId=&CountyId=&CountyIdCount=&CountyIds=10%2C15%2C11%2C16%2C12%2C18%2C14&p=C&SOrder=1&KeyWord=&SearchFor=&SearchBy=&SearchFlag=&SearchName=Enter+Search+Name&EmailAlert=&EmailType=&ReportSection=O&WebSearches=Y"
SFGateOpenHousesPageFetcher_queryUrl = "http://realestate.sfgate.com/RealEstate/openhouses/SearchResults.asp"
SFGateOpenHousesPageFetcher_lidRegEx = re.compile(".*javascript:SaveSelect\('(?P<lid>[^']+)','S'\).*")

SFGateOpenHousesPageFetcher_nextPageFormRegEx = re.compile("<form method=\"POST\" name=\"TheNextPage\" action=\"SearchResults.asp\">")
SFGateOpenHousesPageFetcher_nextPageFormInputRegEx = re.compile(".*<input type=\"hidden\" name=\"(?P<name>[^\"]+)\" value=\"(?P<value>[^\"]+)\">")


SFGateOpenHousesDetailPage_detailsStartLineRegEx = re.compile(".*<tr><td align=\"left\" valign=\"top\" class=\"text2sm\" colspan=\"14\">.*")
SFGateOpenHousesDetailPage_detailsEndLineRegEx = re.compile("</td></tr>")
SFGateOpenHousesDetailPage_detailsOpenHouseRegEx = re.compile(".*ALT=\"Open House\"")
SFGateOpenHousesDetailPage_detailsOpenTimeRegEx = re.compile("<TD STYLE=\"font: normal 9px arial,helvetica,sans-serif;\">Open House (?P<time>[^<]+)</TD>")

class SFGateOpenHousesDetailPage:
  def __init__(self, lid):
    self._loaded = False
    self._url = "http://realestate.sfgate.com/RealEstate/Sales/Listing.asp?lid=" + lid
    self._openTimes = []
    self._details = ""

  def getUrl(self):
    return self._url

  def getOpenTimes(self):
    self._loadPage()
    return self._openTimes

  def getDetails(self):
    self._loadPage()
    return self._details

  def _loadPage(self):
    if (self._loaded):
      return
    self._loaded = True

    state = 0
    detailsPage = urllib.urlopen(self._url)
    for line in detailsPage:
      match = SFGateOpenHousesDetailPage_detailsOpenHouseRegEx.match(line)
      if match:
        matches = SFGateOpenHousesDetailPage_detailsOpenTimeRegEx.finditer(line)
        for match in matches:
          self._openTimes.append(match.group('time'))

      if state == 0:
        match = SFGateOpenHousesDetailPage_detailsStartLineRegEx.match(line)
        if match:
          state = 1
      elif state == 1:
        match = SFGateOpenHousesDetailPage_detailsEndLineRegEx.match(line)
        if match:
          state = 2
        else:
          self._details = self._details + line.strip() + " "

    self._details = self._details.strip()

  def __str__(self):
    return self._url

  def __repr__(self):
    return self._url

class SFGateOpenHousesListPageFetcher:
  def __init__(self):
    self.__query = {}
    self._primeQueryParameters();

  def _primeQueryParameters(self):
    state = 0
    page = urllib.urlopen(SFGateOpenHousesPageFetcher_initialQueryUrl)
    for line in page:
      if state == 0:
        if SFGateOpenHousesPageFetcher_nextPageFormRegEx.match(line):
          state = 1
      elif state == 1:
        match = SFGateOpenHousesPageFetcher_nextPageFormInputRegEx.match(line)
        if match:
          self.__query[match.group("name")] = urllib.quote(match.group("value"));
      else:
        none

  def getLastPage(self):
    return int(self.__query["LastPage"]);

  def getUrl(self, page = 1):
    url = SFGateOpenHousesPageFetcher_queryUrl;
    seperator = "?"
    self.__query["ThisPage"] = str(page)
    for name in self.__query:
      url = url + seperator + name + "=" + self.__query[name]
      seperator = "&"

    return url

  def getPage(self, page = 1):
    page = urllib.urlopen(self.getUrl(page))
    for line in page:
      print line

  def getDetailPages(self):
    detailPages = []

    for page in range(1, self.getLastPage() + 1):
      page = urllib.urlopen(self.getUrl(page))
      for line in page:
        match = SFGateOpenHousesPageFetcher_lidRegEx .match(line)
        if match:
          detailPage = SFGateOpenHousesDetailPage(match.group('lid'));
          detailPages.append(detailPage)

    return detailPages

  
def usage():
  print """Usage: FileFind [-h][--name pattern][--dir][--file][--before date][--after date] path
  -h     - help
  -d day - 6 Saturday, 7 Sunday, default all days
"""


def main():
  try:
    options, arguments = getopt.getopt(
     sys.argv[1:], "?hd:", ["help", "day=" ] )
  except getopt.GetoptError:
    print "Invalid arguments"
    usage()
    sys.exit(2)

  day = ""
  for option, argument in options:
    if option in ("-h", "--help", "-?"):
      usage()
      sys.exit(0)

    if option in ("-d", "--day"):
      if argument == "6":
        day = "Sat"
      elif argument == "7":
        day = "Sun"
      else:
        print "Option 'day' parameter invalid: " + argument
        print "Only day 6 (Saturday) and 7 (Sunday) are supported"
        sys.exit(1)

  listFetcher = SFGateOpenHousesListPageFetcher()

  for page in listFetcher.getDetailPages():
    details = page.getDetails();
    if details.strip() == "":
      details = page.getUrl()

    if day:
      open = False
      for time in page.getOpenTimes():
        if time.find(day) >= 0:
          open = True
    else:
      open = True

    if open:
      print details + " " + page.getUrl() + " (" + string.join(page.getOpenTimes(), ", ") + ")"
      print

if __name__ == "__main__":
  main()


#page = urllib.urlopen("http://realestate.sfgate.com/RealEstate/Sales/Listing.asp?lid=20-ch5072307")
#for line in page:
#  print line.strip()
#

#page = SFGateOpenHousesDetailPage("20-ch5072307")
#print "open: " + string.join(page.getOpenTimes(), ", ")

#fetcher = SFGateOpenHousesListPageFetcher()
#fetcher.getPage()


