# encoding: utf-8
# frozen_string_literal: false

BASIC = <<-CODE
# encoding: utf-8
# frozen_string_literal: false
require 'propane'

class %s < Propane::App
  def setup
    size %s, %s
  end

  def draw

  end
end

%s.new title: '%s'
CODE

MODE = <<-CODE
# encoding: utf-8
# frozen_string_literal: false
require 'propane'

class %s < Propane::App
  def setup
    size %s, %s, %s
  end

  def draw

  end
end

%s.new title: '%s'
CODE

INNER = <<-CODE
# encoding: utf-8
# frozen_string_literal: false
class %s
  include Propane::Proxy

end
CODE

# processing wrapper module
module Propane
  require_relative '../helpers/string_extra'
  # Write file to disk
  class SketchWriter
    attr_reader :file
    def initialize(path)
      underscore = StringExtra.new(path).underscore
      @file = "#{File.dirname(path)}/#{underscore}.rb"
    end

    def save(template)
      File.open(file, 'w+') do |f|
        f.write(template)
      end
    end
  end

  # An abstract class providing common methods for real creators
  class Creator
    ALL_DIGITS = /\A\d+\Z/

    def already_exist(path)
      underscore = StringExtra.new(path).underscore
      new_file = "#{File.dirname(path)}/#{underscore}.rb"
      return if !FileTest.exist?(path) && !FileTest.exist?(new_file)
      puts 'That file already exists!'
      exit
    end

    # Show the help/usage message for create.
    def usage
      puts <<-USAGE

      Usage: propane --create <sketch_to_generate> <width> <height> <mode>
      optional mode can be P2D / P3D.
      Use    --inner to generated a ruby version of 'java' Inner class
      Examples: propane --create app 800 600
      propane --create app 800 600 p3d 
      propane --create inner_class --inner

      USAGE
    end
  end

  # This class creates bare sketches, with an optional render mode
  class BasicSketch < Creator
    def template_default
      format(BASIC, @name, @width, @height, @name, @title)
    end

    def template_mode
      format(MODE, @name, @width, @height, @mode, @name, @title)
    end
    # Create a class wrapped sketch, given a path.
    def create!(path, args)
      return usage if /\?/ =~ path || /--help/ =~ path
      main_file = File.basename(path, '.rb') # allow uneeded extension input
      # Check to make sure that the main file doesn't exist already
      already_exist(path)
      @name = StringExtra.new(main_file).camelize
      writer = SketchWriter.new(main_file)
      @title = StringExtra.new(main_file).titleize
      @width, @height = args[0], args[1]
      @mode = args[2].upcase unless args[2].nil?
      template = @mode.nil? ? template_default : template_mode
      writer.save(template)
    end
  end

  # This class creates a pseudo 'java inner class' of the sketch
  class Inner < Creator
    def inner_class_template
      format(INNER, @name)
    end
    # Create a pseudo inner class, given a path.
    def create!(path, _args_)
      return usage if /\?/ =~ path || /--help/ =~ path
      main_file = File.basename(path, '.rb') # allow uneeded extension input
      # Check to make sure that the main file doesn't exist already
      already_exist(path)
      @name = main_file.camelize
      writer = SketchWriter.new(main_file)
      template = inner_class_template
      writer.save(template)
    end
  end
end