###############################################################################
#  Module name: RFC_Sites
#                                                                             #
#  Author     : Zhengtao Cui (Zhengtao.Cui@noaa.gov)                          #
#                                                                             #
#  Initial version date:                                                      #
#                                                                             #
#  Last modification date:  08/19/2019                                         #
#                                                                             #
#  Description: manage the RFC sites in CSV format                       #
#                                                                             #
###############################################################################

import csv

class RFC_Sites:
        """
           Store RFC site information 
        """        
        def __init__(self, csvSitefile ):
           """
              Initialize the RFC_Sites object with a given
              filename
           """
           self.source = csvSitefile

           self.gauge = []
           self.gaugedFlowline = []
           self.NHDWaterbodyComID = []
           self.lakeLink = []
           self.SiteName = []
           self.RFC = []
           self.comments = []
           with open( csvSitefile, mode='r') as csvsite_file: 
                   csvsite_reader = csv.DictReader( csvsite_file )
                   line_count = 0
                   for row in csvsite_reader:
                       if line_count == 0:
                              print('Column names are ' + ", ".join(row))
                              line_count += 1
                       self.gauge.append( row["gage"] )                   
                       self.gaugedFlowline.append( row["gagedFlowline"] )
                       self.NHDWaterbodyComID.append( row["NHDWaterbodyComID"] )
                       self.lakeLink.append( row["lakeLink"] ) 
                       self.SiteName.append( row["SiteName"] )
                       self.RFC.append( row["RFC"] )
                       self.comments.append( "Not present!" ) 
                       line_count += 1

                   print('Processed ' + str( line_count ) + ' lines.')


        @property
        def source(self):
            return self._source

        @source.setter
        def source(self, s):
            self._source = s

        @property
        def gauge(self):
            return self._gauge

        @gauge.setter
        def gauge(self, g):
            self._gauge=g

        @property
        def gaugedFlowline(self):
            return self._gaugedFlowline

        @gaugedFlowline.setter
        def gaugedFlowline(self, g):
            self._gaugedFlowline=g

        @property
        def NHDWaterbodyComID(self):
            return self._NHDWaterbodyComID

        @NHDWaterbodyComID.setter
        def NHDWaterbodyComID(self, n):
            self._NHDWaterbodyComID=n

        @property
        def lakeLink(self):
            return self._lakeLink

        @lakeLink.setter
        def lakeLink(self, l):
            self._lakeLink=l

        @property
        def SiteName(self):
            return self._SiteName

        @SiteName.setter
        def SiteName(self, s):
            self._SiteName=s

        @property
        def RFC(self):
            return self._RFC

        @RFC.setter
        def RFC(self, r):
            self._RFC=r

        @property
        def comments(self):
            return self._comments

        @comments.setter
        def comments(self, c):
            self._comments=c

        def siteExist(self, s):
            return s in self.gauge

        def addComment( self, sta, message ):
              try:
                   ind = self.gauge.index( sta )
                   self._comments[ ind ] = message
              except ValueError as e:  
                   raise RuntimeError( e )

        def getSitesByRFC( self, rfcname ):
                sites = []
                for s, rfc in zip(self.gauge, self.RFC):
                    if rfc == rfcname:
                       sites.append( s )
                return sites

        def getRFCBySite( self, sta ):
            for s, rfc in zip(self.gauge, self.RFC):
                if s == sta:
                  return rfc
            return None