#!/usr/bin/env ruby
require 'etc'
require 'logger'
require 'optparse'
require 'redis'
require 'sisimai'
require 'json'
require 'find'

# Parse command-line arguments
options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: bounce.rb [options]"

  opts.on("--test", "Run in test mode") do |v|
    options[:test] = true
  end

  opts.on("--prod", "Run in production mode") do |v|
    options[:test] = false
  end

  opts.on("--directory DIRECTORY", "Directory containing .eml files") do |v|
    options[:directory] = v
  end
end.parse!

# Validate the directory option
if options[:directory].nil?
  puts "Please specify a directory containing .eml files using --directory"
  exit 1
end

# Configure Logger
# It should be with permission mail mail
logfile = '/var/mail/bounce_mail.txt'
logger = Logger.new(logfile)
error_logfile = '/var/mail/bounce_error.txt'
error_logger = Logger.new(error_logfile)

begin
  logger.info("Script started") if options[:test]

  # Log the effective user ID and user name
  euid = Process.euid
  user = Etc.getpwuid(euid).name
  logger.info("Script started by user: #{user} (EUID: #{euid})") if options[:test]

  # Process each .eml file in the specified directory
  Find.find(options[:directory]) do |path|
    next unless path =~ /\.eml$/

    begin
      logger.info("Processing file: #{path}") if options[:test]

      # Process mail with Sisimai directly from the file
      v = Sisimai.rise(path)
      logger.info("Sisimai processing completed for file: #{path}") if options[:test]

      if v.is_a? Array
        v.each do |e|
          if options[:test]
            logger.info(e.to_json)
          else
            # Publish to Redis channel in production mode
            begin
              redis = Redis.new(db: 5)
              redis.publish('bounce_mail_channel', e.to_json)
            rescue => e
              error_logger.error("Failed to publish to Redis: #{e.message}")
              error_logger.error(e.backtrace.join("\n"))
            ensure
              # Ensure Redis connection is closed after use
              redis.close if redis
              logger.info("Redis connection closed after publishing") if options[:test]
            end
          end
        end
      else
        logger.info('No bounce detected in file: #{path}') if options[:test]
      end

    rescue => e
      logger.error("An error occurred processing file #{path}: #{e.message}") if options[:test]
      logger.error(e.backtrace.join("\n")) if options[:test]

      # Log error to error file
      error_logger.error("An error occurred processing file #{path}: #{e.message}")
      error_logger.error(e.backtrace.join("\n"))

    end
  end

  logger.info("Script completed successfully") if options[:test]
  exit 0

rescue => e
  logger.error("An error occurred: #{e.message}") if options[:test]
  logger.error(e.backtrace.join("\n")) if options[:test]

  # Log error to error file
  error_logger.error("An error occurred: #{e.message}")
  error_logger.error(e.backtrace.join("\n"))

  exit 1
end
