#!/usr/bin/env nush
#
# @file nuapp
# Creates a Nu application shell
#
# @copyright Copyright (c) 2008 Matt McCray, Elucidata unLTD.

(load "nu")
(load "cocoa")
(load "doc")
(load "template")

(function sh (command)
(puts command)
(set result (system command))
(if result
(puts "nuapp: error #{result})")
(exit result)))

(function create-project (projectName)
(set projectName (projectName capitalizedString))
(set projectShortName (projectName replaceString:" " withString:""))

(puts "Creating Nu App Project: #{projectName}")

;; Create folders...
(sh "mkdir '#{projectShortName}'")
(sh "mkdir '#{projectShortName}/nu'")
(sh "mkdir '#{projectShortName}/objc'")
(sh "mkdir '#{projectShortName}/resources'")
(sh "mkdir '#{projectShortName}/resources/English.lproj'")
(sh "mkdir '#{projectShortName}/resources/content'")
(sh "mkdir '#{projectShortName}/resources/content/#{projectShortName}Help'")
(sh "mkdir '#{projectShortName}/resources/content/#{projectShortName}Help/styles'")
(sh "mkdir '#{projectShortName}/resources/content/#{projectShortName}Help/images'")

;; Create initial main.nu, Nukefile, Credits.html, and Help index.html
(set main-nu (eval (NuTemplate codeForString:main-entry)))
(main-nu writeToFile:"#{projectShortName}/nu/main.nu")

(set nukefile (eval (NuTemplate codeForString:nuke-file)))
(nukefile writeToFile:"#{projectShortName}/Nukefile")

(set credits-file (eval (NuTemplate codeForString:credits)))
(credits-file writeToFile:"#{projectShortName}/resources/content/Credits.html")

(set help-file (eval (NuTemplate codeForString:swtitle-help)))
(help-file writeToFile:"#{projectShortName}/resources/content/#{projectShortName}Help/swtitle.html")

(set layout-file (eval (NuTemplate codeForString:layout-css)))
(layout-file writeToFile:"#{projectShortName}/resources/content/#{projectShortName}Help/styles/layout.css")

(puts "Done."))


(set main-entry <<-EONU
;; @file main.nu
;; @discussion Entry point for <%= projectName %>.
;;
;; @copyright Copyright (c ) 2008

(load "Nu:nu") ;; basics
(load "Nu:cocoa") ;; cocoa definitions
(load "Nu:menu") ;; menu generation

;; define the application delegate class
(class ApplicationDelegate is NSObject
(- applicationDidFinishLaunching:sender is
(build-menu default-application-menu "<%= projectName %>")))

;; install the delegate and keep a reference to it since the application won't retain it.
((NSApplication sharedApplication) setDelegate:(set delegate ((ApplicationDelegate alloc) init)))

;; this makes the application window take focus when we've started it from the terminal
((NSApplication sharedApplication) activateIgnoringOtherApps:YES)

;; run the main Cocoa event loop
(NSApplicationMain 0 nil)
EONU)


(set nuke-file <<-EONU
;; Nukefile for <%= projectName %>

;; source files
(set @nu_files (filelist "^nu/.*nu$"))
(set @c_files (filelist "^objc/.*.c$"))
(set @m_files (filelist "^objc/.*.m$"))
(set @icon_files (filelist "^resources/content/.*icns$"))
(set @resources (filelist "^resources/content/[^/]*$"))
;(set @nib_files (filelist "^resources/.*\.lproj/[^/]*\.nib$"))

;; application description
(set @application "<%= projectShortName %>")
(set @application_identifier "nu.programming.<%= projectShortName %>")
(set @application_icon_file "app-icon.icns")
(set @application_help_folder "<%= projectShortName %>Help")

;; tasks
(compilation-tasks)
(application-tasks)

(task "default" => "application")
EONU)

(set credits <<-EONU
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title><%= projectName %> Credits</title>
<style>
BODY { font-family: Lucida Grande; }
H1 { font-size: 110%; }
DT { font-weight: normal; }
DT SPAN { color: gray; }
DD { margin-left: 0px; padding-left: 10px; margin-bottom: 25px; }
</style>
</head>
<body>
<h1>Requisite Beta Disclaimer</h1>
<p>
<%= projectName %> is BETA software! It might violently explode thereby
taking out your computer, you, your neighbors, and three square blocks
of your neighborhood. Use at your own risk.
</p>
</body>
</html>
EONU)

(set swtitle-help <<-EONU
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<META NAME="AppleTitle" CONTENT="<%= projectName %> Help">
<META NAME="AppleIcon" CONTENT="../../app-icon.icns">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><%= projectName %> Help</title>
<link rel="Stylesheet" type="text/css" href="styles/layout.css">
</head>
<body>
<h3><%= projectName %></h3>

<h4>Requisite Beta Disclaimer</h4>
<p>
This is BETA software! It might violently explode thereby taking out
your computer, you, your neighbors, and three square blocks of your
neighborhood. Use at your own risk.
</p>

<h3>Known Issues</h3>
<ul>
<li>...</li>
</ul>

</body>
</html>
EONU)

(set layout-css <<-EONU
/* Help Styles for <%= projectName %> */

BODY {
font-family: lucida grande;
font-size: 12px;
}
EONU)

(set argv ((NuApplication sharedApplication) arguments))
(if (== 0 (argv count))
(then
(puts "You must supply a project name"))
(else
(create-project (argv 0))))