#!/usr/bin/ruby
# coding: UTF-8

require 'dotenv'
require 'pastebin'
require 'highline/import'


rc_path = "#{ENV['HOME']}/.pastebinrc" # runtime configuration
raw_id = nil
is_login_mode = false
is_raw_mode = false
is_skel_mode = false
is_defaults_mode = false

options = {}

opts = OptionParser.new do |o|
	o.banner =<<EOB
Pastebin is a CLI to https://pastebin.com
Usage: pastebin [options]

Examples:
	pastebin -f foo.rb -n rub_script -l ruby -e 10m
	cat foo.rb | pastebin -l ruby
EOB
	
	o.separator('')
	o.separator('Options:')
	
	o.on('-c <file>', '--config <file>', String, "Used config file.", "Default: #{rc_path}") do |f|
		rc_path = f
	end
	
	o.on('-f <file>', '--file <file>', String, "Use a file for input, '-' for STDIN.") do |f|
		options["api_paste_code"] = f
	end
	
	o.on('-n', '--name <name>', String, 'Assign a name to your paste.') do |n|
		options['api_paste_name'] = n
	end
	
	expire_a = ['n', '10m', '1h', '1d', '1m']
	expire_s = expire_a.join(', ')
	o.on('-e', '--expire <time>', expire_a, 'These can be abbriviated, as long as they are unambigous.', "#{expire_s}", 'Default: n (never)' ) do |e|
		options['api_paste_expire_date'] = e.upcase
	end
	
	o.on('-l', '--language <syntax>', String, "See https://pastebin.com/api - The 'api_paste_format' Paramater.") do |l|
		options['api_paste_format'] = l
	end
	
	o.on('-u', '--unlisted', 'Make paste unlisted. (API_PASTE_PRIVATE=1)') do
		options['api_paste_private'] = '1'
	end
	
	o.on('-p', '--private', 'Make paste private.  (API_PASTE_PRIVATE=2)') do
		options['api_paste_private'] = '2'
	end
	
	o.on('-r', '--raw <link>', String, 'Return raw text from a paste link.') do |r|
		is_raw_mode = true
		raw_id = r
	end
	
	o.on_tail(nil, '--login', 'Login on pastebin.com with your user credentials.') do
		is_login_mode = true
	end
	
	o.on_tail(nil, '--skel', 'Print a basic example configuration.') do
		is_skel_mode = true
	end
	
	o.on('-D', '--defaults', String, 'Print defaults.') do |r|
		is_defaults_mode = true
	end
	
	o.on_tail('--version', 'Show version.') do
		puts "#{TheFox::Pastebin::NAME} #{TheFox::Pastebin::VERSION} (#{TheFox::Pastebin::DATE})"
		puts TheFox::Pastebin::HOMEPAGE
		exit
	end
	
	o.on_tail('-h', '--help', 'Show this message.') do
		puts opts
		exit 3
	end
end

opts.parse(ARGV)

if File.exist?(rc_path)
	Dotenv.load(rc_path)
end

if ENV.has_key?('API_DEV_KEY') && ENV['API_DEV_KEY'] != ''
	options['api_dev_key'] = ENV['API_DEV_KEY']
end
if ENV.has_key?('API_USER_KEY') && ENV['API_USER_KEY'] != ''
	options['api_user_key'] = ENV['API_USER_KEY']
end
if !options.has_key?('api_paste_expire_date') && ENV.has_key?('API_PASTE_EXPIRE_DATE') && ENV['API_PASTE_EXPIRE_DATE'] != ''
	options['api_paste_expire_date'] = ENV['API_PASTE_EXPIRE_DATE'].upcase
end
if !options.has_key?('api_paste_format') && ENV.has_key?('API_PASTE_FORMAT') && ENV['API_PASTE_FORMAT'] != ''
	options['api_paste_format'] = ENV['API_PASTE_FORMAT']
end
if !options.has_key?('api_paste_private') && ENV.has_key?('API_PASTE_PRIVATE') && ENV['API_PASTE_PRIVATE'] != ''
	options['api_paste_private'] = ENV['API_PASTE_PRIVATE']
end
if ENV.has_key?('NAME_PREFIX') && ENV['NAME_PREFIX'] != ''
	options['name_prefix'] = ENV['NAME_PREFIX']
end
if ENV.has_key?('NAME_POSTFIX') && ENV['NAME_POSTFIX'] != ''
	options['name_postfix'] = ENV['NAME_POSTFIX']
end

pastebin = TheFox::Pastebin::Pastebin.new(options)

begin
	if is_login_mode
		api_user_name = ask('Username: ') do |q|
			q.validate = /^./
		end
		api_user_password = ask('Password: ') do |q|
			q.echo = '*'
			q.validate = /^./
		end
		
		api_user_key = pastebin.login(api_user_name, api_user_password)
		
		puts
		puts 'Login OK.'
		puts
		puts "Now you need to set your key to '#{rc_path}'."
		puts 'Like this:'
		puts "API_USER_KEY=#{api_user_key}"
		puts
	elsif is_raw_mode
		if !raw_id.nil?
			print pastebin.raw(raw_id)
		end
	elsif is_skel_mode
		pastebin.print_skel
	elsif is_defaults_mode
		pastebin.print_defaults
	else
		puts pastebin.paste
	end
rescue Exception => e
	puts "ERROR: #{e}"
	exit 1
end
