# -*- coding: utf-8 -*-
import codecs
import re
import json
from datetime import datetime
from indic_transliteration.sanscript import transliterate
"""
Holds different reusable utilities for other programs.
"""


def extract_tag(metaline):
	# Typical line in metadata is of the structure `;tag{value}`
	m = re.search(';([^{]*)\{([^}]*)\}', metaline)
	# If matches typical line,
	if m:
		# Extract tag and value.
		tag = m.group(1)
		value = m.group(2)
	else:
		tag = False
		value = False
	return (tag, value)

def prepare_metadata(metatext):
	"""Extract metadata from the text file and return a dict."""

	# Read line wise
	lines = metatext.split('\n')
	# Initialize the blank metadata dict.
	metadata = {}
	for line in lines:
		# Ignore if the line is blank or a marker for starting of metadata.
		if line.startswith(';METADATA') or line == '':
			pass
		# If the line does not start with ';' - there is some error.
		elif not line.startswith(';'):
			print('Check line. Does not follow metadata structure.')
			print(line)
		else:
			(tag, value) = extract_tag(line)
			if tag:
				# Add to the metadata dict.
				metadata[tag] = value
			else:
				# There may be some error. Check up.
				print('Check line. Does not follow metadata structure.')
	return metadata


def remove_page_line(content):
	"""Remove page markers and line markers."""

	result = []
	# read lines into a list
	lines = content.split('\n')
	for line in lines:
		# Ignore the page and line markers
		if line.startswith(';p{') or line.startswith(';l{'):
			pass
		else:
			# Add to the output list
			result.append(line)
	# Join with new line marker.
	return '\n'.join(result)


def timestamp():
	return datetime.now()


class VerseInfo():
	"""Hold the information regarding current verse being handled."""

	def __init__(self):
		"""Initialize with default values."""
		self.kanda = ''
		self.varga = ''
		self.subvarga = ''
		self.kandaNum = 1
		self.vargaNum = 1
		self.subvargaNum = 1
		self.pageNum = 1
		self.verseNum = 1
		self.lastVerseNum = 0

	def update_pageNum(self, pageNum):
		"""Upadate pageNum."""
		self.pageNum = pageNum

	def update_subvarga(self, subvarga):
		"""Update subvarga. Also identify its name."""
		self.subvarga = subvarga
		self.subvargaNum += 1

	def update_varga(self, varga):
		"""Update varga. Reset subvargaNum to 1."""
		self.subvarga = ''
		self.subvargaNum = 1
		self.varga = varga
		self.vargaNum += 1

	def update_kanda(self, kanda):
		"""Update kanda. Reset vargaNum and subvargaNum to 1."""
		self.subvarga = ''
		self.subvargaNum = 1
		self.varga = ''
		self.vargaNum = 1
		self.kanda = kanda
		self.kandaNum += 1

	def update_verseNum(self, verse):
		"""Identify the verse number from verse and update verseNum."""
		m = re.search('[॥|..] ([0123456789०१२३४५६७८९]+) [॥|..]', verse)
		if m:
			self.lastVerseNum = int(transliterate(m.group(1), 'devanagari', 'slp1'))
			self.verseNum = self.lastVerseNum
		# Unless you encounter the next verse number, you need to use prev + 1.
		else:
			self.verseNum = self.lastVerseNum + 1

	def give_verse_details(self):
		"""Return names of kanda, varga, subvarga and number of verse."""
		return self.kanda + '.' + self.varga + '.' + self.subvarga + '.' + str(self.verseNum)

	def give_page_details(self):
		"""Return pageNum."""
		return self.pageNum

	def give_verse_num_details(self):
		"""Return numbers of kanda, varga, subvarga and verse."""
		return str(self.kandaNum) + '.' + str(self.vargaNum) + '.' + str(self.subvargaNum) + '.' + str(self.verseNum)

dictcodes = {
"AMAR": "namalinganushasana_amarasinha",
"ANKS": "anekarthasamuchchaya_shashvata",
"VPRM": "vishvaprakasha_maheshvara",
"VJYP": "vaijayanti_yadavaprakasha",
"HVPD": "haravali_purushottamadeva",
"ABCH": "abhidhanachintamani_hemachandra",
"NGSH": "nighantushesha_hemachandra",
"NSKS": "nanartharnavasankshepa_keshavasvamin",
"VLSS": "vishvalochana_shridharasena",
"NSAP": "nanarthasangraha_ajayapala",
"KDKS": "kalpadrukosha_keshava",
"TSPD": "trikandashesha_purushottamadeva",
"ATMH": "anekarthatilaka_mahipa",
"NRMI": "nanartharatnamala_irugapa",
"SRSS": "shabdaratnasamanvaya_sahaji",
"LKPK": "lokaprakasha_kshemendra",
"ENSK": "ekaksharanamamala_sadhukalashagani",
"SRSG": "shabdaratnakara_sadhusundaragani",
"SKGL": "shivakosha_ghasilal",
"NDSG": "nanarthodayasagara_ghasilal",
"NMMD": "namamala_dhananjaya",
"EKPD": "ekaksharakosha_purushottamadeva",
"ANSH": "anekarthasangraha_hemachandra",
"PRMM": "paramanandiyanamamala_makarandadasa",
"ENMS": "ekarthanamamala_saubhari",
"DNMS": "dvyaksharinamamala_saubhari",
"NNMR": "nanarthamanjari_raghava",
"ANMG": "anekarthanamamala_jnanasagara",
"ANND": "anekarthanighantu_dhananjaya",
"EKKA": "ekaksharikosha_amarakavi",
"NMMB": "namamalika_bhoja",
"SBRP": "shabdaratnapradipa_agyata",
"ANKM": "anekarthakosha_mankha",
"ARMH": "abhidhanaratnamala_halayudha",
"NSMK": "nanarthashabdakosha_medinikara",
"ACPH": "abhidhanachintamaniparishishta_hemachandra",
"ACSJ": "abhidhanachintamanishiloncha_jinadeva",
"DNMH": "deshinamamala_hemachandra",
"PLDP": "paiyalachchhi_dhanapala",
"DRSH": "dvirupadikosha_shriharsha",
"KNVP": "kriyanighantu_virapandya",
"DKPD": "dvirupakosha_purushottamadeva",
"SBPM": "shabdabhedaprakasha_maheshvara",
"DKDD": "dharanikosha_dharanidasa",
"PSRD": "paryayashabdaratna_dhananjaya",
"SRVB": "shabdaratnakara_vamanabhatta",
"SNHK": "sharadiyakhyanamamala_harshakirti",
"ANHK": "anekarthanamamala_harshakirti",
"ADMK": "anekarthadhvanimanjari_mahakshapanaka",
"KKTV": "koshakalpataru_vishvanatha",
"RKRP": "rabhasakosha_rabhasapala",
"SKSD": "shivakosha_shivadatta",
"SRMS": "shabdaratnavali_mathuresha",
"PTVD": "panchatattvaprakasha_venidatta",
"LVVV": "lingavisheshavidhi_vararuchi",
"SSSK": "siddhashabdarnava_sahajakirti",
"SERS": "sundaraikaksharakosha_rajasundaravijayasuri",
"NSRK": "nanarthashabdaratna_kalidasa",
"EKVS": "ekaksharanamamalika_vishvashambhu",
"EKMD": "ekaksharashabdamala_madhava",
"EKVR": "ekaksharanamamala_vararuchi",
"EKKU": "ekaksharakosha_agyata",
"EKNU": "ekaksharanamamala_agyata",
"EKMK": "ekaksharimatrikakosha_agyata",
"EKAJ": "ajiradiekaksharanamamala_agyata",
"ENNT": "natvadiekaksharanamamala_agyata",
"EKAB": "abhidhanadiekaksharanamamala_agyata",
"EKPM": "ekaksharakosha_panditamanohara",
"EKKD": "ekaksharanamamala_kalidasavyasa",
"EKSS": "ekaksharakoshamala_sushilasuri",
"EKBP": "ekaksharakoshabhidhana_bhaskarapandita",
"EKAP": "ekaksharakosha_agyatapandita",
"ESSK": "ekadisankhyasangyakosha_agyata",
"ENRV": "ekaksharinamamala_ratanuvirabhana",
"EKHM": "ekaksharashabdamala_haritalarajamatyamadhava",
"GNHD": "ganitanamamala_haradatta",
"AVYK": "avyayakosha_agyata",
"MTRK": "matrikakosha_agyata",
"AVJB": "avyayarnava_jayabhattaraka",
"SRVC": "shabdarnava_vachaspati",
"UTVD": "utpalini_vyadi",
"SAVD": "samsaravarta_vikramaditya",
"EVBM": "ekavarnarthasangraha_bharatamallika",
"DDBM": "dvirupadhvanisangraha_bharatamallika",
"VARS": "vanmayarnava_ramavatarasharman",
"SNVS": "sushilanamamala_vijayasushilasuri",
"TSSU": "trishashasakarabheda_agyata"
}


dictcodes_slp = {
"AMAR": "nAmaliNgAnuSAsana_amarasiMha",
"ANKS": "anekArTasamuccaya_SASvata",
"VPRM": "viSvaprakASa_maheSvara",
"VJYP": "vEjayantI_yAdavaprakASa",
"HVPD": "hArAvalI_puruzottamadeva",
"ABCH": "aBiDAnacintAmaRi_hemacandra",
"NGSH": "niGaRwuSeza_hemacandra",
"VLSS": "viSvalocana_SrIDarasena",
"NSAP": "nAnArTasaNgraha_ajayapAla",
"TSPD": "trikARqaSeza_puruzottamadeva",
"ATMH": "anekArTatilaka_mahIpa",
"NRMI": "nAnArTaratnamAlA_irugapa",
"SRSS": "Sabdaratnasamanvaya_sAhajI",
"ENSK": "ekAkzaranAmamAlA_sADukalaSagaRi",
"SRSG": "SabdaratnAkara_sADusundaragaRi",
"SKGL": "Sivakoza_GAsIlAla",
"NDSG": "nAnArTodayasAgara_GAsIlAla",
"NMMD": "nAmamAlA_DanaYjaya",
"EKPD": "ekAkzarakoza_puruzottamadeva",
"ANSH": "anekArTasaNgraha_hemacandra",
"NNMR": "nAnArTamaYjarI_rAGava",
"NMMB": "nAmamAlikA_Boja",
"ANKM": "anekArTakoza_maNKa",
"ARMH": "aBiDAnaratnamAlA_halAyuDa",
"NSMK": "nAnArTaSabdakoza_medinikara",
"ACPH": "aBiDAnacintAmaRipariSizwa_hemacandra",
"ACSJ": "aBiDAnacintAmaRiSiloYCa_jinadeva",
"DRSH": "dvirUpakoza_SrIharza",
"KNVP": "kriyAniGaRwu_vIrapARqya",
"DKPD": "dvirUpakoza_puruzottamadeva",
"SBPM": "SabdaratnaprakASa_maheSvara",
"ADMK": "anekArTaDvanimaYjarI_mahAkzapaRaka",
"ANHK": "anekArTanAmamAlA_harzakIrti",
"ENMS": "ekArTanAmamAlA_sOBari",
"DNMS": "dvyakzarInAmamAlA_sOBari",
"NSKS": "nAnArTArRavasaMkzepa_keSavasvAmin",
"RKRP": "raBasakoza_raBasapAla",
"SNHK": "SAradIyAKyanAmamAlA_harzakIrti",
"PSRD": "paryAyaSabdaratna_DanaYjaya",
"SKSD": "Sivakoza_Sivadatta",
"DKDD": "DaraRikoza_DaraRidAsa",
"EKKA": "ekAkzarIkoza_amarakavi",
"ANND": "anekArTaniGaRwu_DanaYjaya",
"PTVD": "paYcatattvaprakASa_veRIdatta",
"LVVV": "liNgaviSezaviDi_vararuci",
"SBRP": "SabdaratnapradIpa_ajYAta",
"PRMM": "paramAnandIyanAmamAlA_makarandadAsa",
"EKMD": "ekAkzaraSabdamAlA_mADava",
"EKVR": "ekAkzaranAmamAlA_vararuci",
"EKKU": "ekAkzarakoza_ajYAta",
"EKNU": "ekAkzaranAmamAlA_ajYAta",
"EKMK": "ekAkzarImAtfkAkoza_ajYAta",
"EKAJ": "ajirAdiekAkzaranAmamAlA_ajYAta",
"ENNT": "natvAdiekAkzaranAmamAlA_ajYAta",
"EKAB": "aBiDAnAdiekAkzaranAmamAlA_ajYAta",
"EKPM": "ekAkzarakoza_paRqitamanohara",
"EKKD": "ekAkzaranAmamAlA_kAlidAsavyAsa",
"EKSS": "ekAkzarakozamAlA_suSIlasUri",
"EKBP": "ekAkzarakozABiDAna_BAskarapaRqita",
"EKAP": "ekAkzarakoza_ajYAtapaRqita",
"ESSK": "ekAdisaNKyAsaYjYAkoza_ajYAta",
"ENRV": "ekAkzarInAmamAlA_ratanUvIraBARa",
"EKHM": "ekAkzaraSabdamAlA_haritAlarAjAmAtyamADava",
"SERS": "sundarEkAkzarakoza_rAjasundaravijayasUri",
"EKVS": "ekAkzaranAmamAlikA_viSvaSamBu",
"GNHD": "gaRitanAmamAlA_haradatta",
"AVYK": "avyayakoza_ajYAta",
"MTRK": "mAtfkAkoza_ajYAta",
"KDKS": "kalpadrukoza_keSava",
"SSSK": "sidDaSabdArRava_sahajakIrti",
"SRMS": "SabdaratnAvalI_maTureSa",
"SRVB": "SabdaratnAkara_vAmanaBawwa",
"AVJB": "avyayArRava_jayaBawwAraka",
"KKTV": "kozakalpataru_viSvanATa",
"SRVC": "SabdArRava_vAcaspati",
"UTVD": "utpalinI_vyAqi",
"SAVD": "saMsArAvarta_vikramAditya",
"EVBM": "ekavarRArTasaNgraha_Baratamallika",
"DDBM": "dvirUpaDvanisaNgraha_Baratamallika",
"VARS": "vANmayArRava_rAmAvatAraSarman",
"SNVS": "suSIlanAmamAlA_vijayasuSIlasUri",
"TSSU": "triSazasakAraBeda_ajYAta"
}

workingdicts = {
"AMAR": "namalinganushasana_amarasinha",
"ANKS": "anekarthasamuchchaya_shashvata",
"VPRM": "vishvaprakasha_maheshvara",
"VJYP": "vaijayanti_yadavaprakasha",
"HVPD": "haravali_purushottamadeva",
"ABCH": "abhidhanachintamani_hemachandra",
"NGSH": "nighantushesha_hemachandra",
"VLSS": "vishvalochana_shridharasena",
"NSAP": "nanarthasangraha_ajayapala",
"TSPD": "trikandashesha_purushottamadeva",
"ATMH": "anekarthatilaka_mahipa",
"NRMI": "nanartharatnamala_irugapa",
"SRSS": "shabdaratnasamanvaya_sahaji",
"ENSK": "ekaksharanamamala_sadhukalashagani",
"SRSG": "shabdaratnakara_sadhusundaragani",
"SKGL": "shivakosha_ghasilal",
"NDSG": "nanarthodayasagara_ghasilal",
"NMMD": "namamala_dhananjaya",
"EKPD": "ekaksharakosha_purushottamadeva",
"ANSH": "anekarthasangraha_hemachandra",
"NNMR": "nanarthamanjari_raghava",
"NMMB": "namamalika_bhoja",
"ANKM": "anekarthakosha_mankha",
"ARMH": "abhidhanaratnamala_halayudha",
"NSMK": "nanarthashabdakosha_medinikara",
"ACPH": "abhidhanachintamaniparishishta_hemachandra",
"ACSJ": "abhidhanachintamanishiloncha_jinadeva",
"DRSH": "dvirupadikosha_shriharsha",
"KNVP": "kriyanighantu_virapandya",
"DKPD": "dvirupakosha_purushottamadeva",
"SBPM": "shabdabhedaprakasha_maheshvara",
"ADMK": "anekarthadhvanimanjari_mahakshapanaka",
"ANHK": "anekarthanamamala_harshakirti",
"ENMS": "ekarthanamamala_saubhari",
"DNMS": "dvyaksharinamamala_saubhari",
"NSKS": "nanartharnavasankshepa_keshavasvamin",
"RKRP": "rabhasakosha_rabhasapala",
"SNHK": "sharadiyakhyanamamala_harshakirti",
"PSRD": "paryayashabdaratna_dhananjaya",
"SKSD": "shivakosha_shivadatta",
"DKDD": "dharanikosha_dharanidasa",
"EKKA": "ekaksharikosha_amarakavi",
"ANND": "anekarthanighantu_dhananjaya",
"PTVD": "panchatattvaprakasha_venidatta",
"LVVV": "lingavisheshavidhi_vararuchi",
"SBRP": "shabdaratnapradipa_agyata",
"PRMM": "paramanandiyanamamala_makarandadasa",
"EKMD": "ekaksharashabdamala_madhava",
"EKVR": "ekaksharanamamala_vararuchi",
"EKKU": "ekaksharakosha_agyata",
"EKNU": "ekaksharanamamala_agyata",
"EKMK": "ekaksharimatrikakosha_agyata",
"EKAJ": "ajiradiekaksharanamamala_agyata",
"ENNT": "natvadiekaksharanamamala_agyata",
"EKAB": "abhidhanadiekaksharanamamala_agyata",
"EKPM": "ekaksharakosha_panditamanohara",
"EKKD": "ekaksharanamamala_kalidasavyasa",
"EKSS": "ekaksharakoshamala_sushilasuri",
"EKBP": "ekaksharakoshabhidhana_bhaskarapandita",
"EKAP": "ekaksharakosha_agyatapandita",
"ESSK": "ekadisankhyasangyakosha_agyata",
"ENRV": "ekaksharinamamala_ratanuvirabhana",
"EKHM": "ekaksharashabdamala_haritalarajamatyamadhava",
"SERS": "sundaraikaksharakosha_rajasundaravijayasuri",
"EKVS": "ekaksharanamamalika_vishvashambhu",
"GNHD": "ganitanamamala_haradatta",
"AVYK": "avyayakosha_agyata",
"MTRK": "matrikakosha_agyata",
"KDKS": "kalpadrukosha_keshava",
"SSSK": "siddhashabdarnava_sahajakirti",
"SRMS": "shabdaratnavali_mathuresha",
"SRVB": "shabdaratnakara_vamanabhatta",
"AVJB": "avyayarnava_jayabhattaraka",
"KKTV": "koshakalpataru_vishvanatha",
"SRVC": "shabdarnava_vachaspati",
"UTVD": "utpalini_vyadi",
"SAVD": "samsaravarta_vikramaditya",
"EVBM": "ekavarnarthasangraha_bharatamallika",
"DDBM": "dvirupadhvanisangraha_bharatamallika",
"VARS": "vanmayarnava_ramavatarasharman",
"SNVS": "sushilanamamala_vijayasushilasuri",
"TSSU": "trishashasakarabheda_agyata"
}

def code_to_dict(code):
	return dictcodes[code]
