#!/usr/bin/env python
"""Parser for parsing iocShell dbLoadRecords commands
These take these forms
1) dbLoadRecords("db/iocRelease.db"   ,"IOC=SIOC:$(AREA):$(IOC_SUFF)")
2) dbLoadRecords ("db/alhCONSTPVs.db")
3) dbLoadRecords "db/asynRecord.db"
4) dbLoadRecords "db/PCOCamera.db", "P=$(PREFIX),R=:$(ID):,TIMEOUT=1,PORT=$(CAM)$(ID),ADDR=0"
5) dbLoadRecords "db/dbSimple.db", "PREFIX=KHKIM"
6) dbLoadRecords("$(AREA_DETECTOR_SUPP)/db/profile.template","P=$(PREFIX):, ID=$(ID), XSIZE=$(XSIZE), X_OFF=$(X_OFF), YSIZE=$(YSIZE), Y_OFF=$(Y_OFF), RESOLUTION=$(RESOLUTION), PREC=1, EGU=$(EGU)")
"""
from __future__ import print_function

import re

# Form regex patterns for the four possible forms
dbLoadRecordsPatterns = []
capturedQuoteOrVar = r'(?:"([^"]+)"|([A-Za-z\d]+))'
quoteOrVar = r'(?:"[^"]+"|[A-Za-z\d]+)'
patternComponentLists = [
    ['dbLoadRecords', r'\(', capturedQuoteOrVar, ',', quoteOrVar, r'\)'],  # dbLoadRecords("db/iocRelease.db", "IOC=SIOC:$(AREA):$(IOC_SUFF)")
    ['dbLoadRecords ', capturedQuoteOrVar, ',', quoteOrVar],               # dbLoadRecords "db/iocRelease.db", "IOC=SIOC:$(AREA):$(IOC_SUFF)"
    ['dbLoadRecords', r'\(', capturedQuoteOrVar, r'\)'],                   # dbLoadRecords("db/alhCONSTPVs.db")
    ['dbLoadRecords ', capturedQuoteOrVar],                                # dbLoadRecords "db/asynRecord.db"
]
for patternComponents in patternComponentLists:
    # Allow spaces between components and comments at the end
    pattern = r'^\s*{}\s*(?:#.*)?$'.format(r'\s*'.join(patternComponents))
    dbLoadRecordsPatterns.append(re.compile(pattern))

def multiRegexMatch(regexPatterns, text):
    '''Matches text against multiple regex patterns'''
    for pattern in regexPatterns:
        result = pattern.match(text)
        if result:
            return result

    return None

def parseDBLoadRecordsCommand(line):
    '''Parses a epics dbLoadRecords command and returns the file name we are loading from'''
    result = multiRegexMatch(dbLoadRecordsPatterns, line)
    if result.group(1):
        return result.group(1)

    if result.group(2):
        return result.group(2)

    return line

if __name__ == "__main__":
    print('|' + parseDBLoadRecordsCommand('dbLoadRecords("db/iocRelease.db"   ,"IOC=SIOC:$(AREA):$(IOC_SUFF)")') + '|')
    print('|' + parseDBLoadRecordsCommand('dbLoadRecords ("db/alhCONSTPVs.db")') + '|')
    print('|' + parseDBLoadRecordsCommand('dbLoadRecords "db/asynRecord.db"') + '|')
    print('|' + parseDBLoadRecordsCommand(
        'dbLoadRecords "db/PCOCamera.db", "P=$(PREFIX),R=:$(ID):,TIMEOUT=1,PORT=$(CAM)$(ID),ADDR=0"') + '|')
    print('|' + parseDBLoadRecordsCommand('dbLoadRecords "db/dbSimple.db", "PREFIX=KHKIM"') + '|')
    print('|' + parseDBLoadRecordsCommand(
        'dbLoadRecords("$(AREA_DETECTOR_SUPP)/db/profile.template","P=$(PREFIX):, ID=$(ID), XSIZE=$(XSIZE), X_OFF=$(X_OFF), YSIZE=$(YSIZE), Y_OFF=$(Y_OFF), RESOLUTION=$(RESOLUTION), PREC=1, EGU=$(EGU)")') + '|')
    print('|' + parseDBLoadRecordsCommand('dbLoadRecords(str,0)') + '|')
    