#!/usr/bin/env python3

import argparse
from pathlib import Path
import sqlglot
from sqlglot.optimizer import optimize
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler


class SqlFileChangeHandler(FileSystemEventHandler):
	def __init__(self, src, tgt):
		self.src_path = Path(f'{src}.sql').resolve()
		self.tgt_path = Path(f'{tgt}.sql').resolve()
		self.src = src
		self.tgt = tgt

	def on_modified(self, event):
		if Path(event.src_path).resolve() == self.src_path:
			self.transpile_and_format_sql()

	def transpile_and_format_sql(self):
		with open(self.src_path, 'r') as file:
			sql = file.read()

		optimized = optimize(sqlglot.parse_one(sql)).sql(pretty=True)
		transpiled = '\n'.join(sqlglot.transpile(optimized, read=self.src, write=self.tgt, pretty=True))

		with open(self.tgt_path, 'w') as file:
			file.write(transpiled)

		print(f'\t{self.src_path.name} ▸ {self.tgt_path.name}')


def main():
	parser = argparse.ArgumentParser(description='Monitor and transpile SQL files.')
	parser.add_argument('src_dialect', default='duckdb', nargs='?', help='Source SQL dialect')
	parser.add_argument('tgt_dialect', default='mysql', nargs='?', help='Target SQL dialect')

	args = parser.parse_args()
	src = args.src_dialect
	tgt = args.tgt_dialect
	Path(f'{src}.sql').touch()

	event_handler = SqlFileChangeHandler(src, tgt)
	observer = Observer()
	observer.schedule(event_handler, path=Path(src).parent)
	observer.start()

	print(f'Monitoring {src}.sql for changes...')
	try:
		while True:
			pass
	except KeyboardInterrupt:
		observer.stop()
	observer.join()


if __name__ == '__main__':
	main()
