# Copyright 2002-2008 Josh Clark and Global Moxie, LLC. This code cannot be 
# redistributed without permission from globalmoxie.com.  For more
# information, consult your Big Medium license.
#
# $Id: Start.pm 3043 2008-03-31 14:00:38Z josh $

package BigMed::App::Web::Start;
use Carp;
$Carp::Verbose = 1;
use strict;
use utf8;
use base qw(BigMed::App::Web);
use BigMed::App::Web::Config;
use BigMed::App::Web::Account;

sub setup {
    my $app = shift;
    $app->start_mode('about-you');
    $app->run_modes(
        'AUTOLOAD'      => sub { $_[0]->rm_about_you() },
        'about-you'     => 'rm_about_you', #step 1
        'about-verify'  => 'rm_about_verify',
        'server'        => 'rm_server', #step 2
        'server-verify' => 'rm_server_verify',
        'account'    => 'rm_first_account', #step 3
        'save-acct'    => 'rm_save_account',
        'ajax-verify-dir'    => 'rm_ajax_verify_dir',
    );
}

sub cgiapp_prerun {       #bump elsewhere if we don't belong...
    my $app = shift;
    my $runmode           = $app->get_current_runmode();
    my $moxiedir = $app->env('MOXIEDATA');
    if ($moxiedir && -e $moxiedir) { #not setting up for first time...
        #see if there are users registered already; if so,
        #bump to config and first site

        require BigMed::User;
        require BigMed::Site;
        my $uselect = BigMed::User->select()
          or $app->error_stop;
        my $users = $uselect->count;
        my $sselect = BigMed::Site->select()
          or $app->error_stop;
        my $sites = $sselect->count;

        my $script;
        if ( $users && $sites ) { #all set, kick over to "real" script
            $script = $runmode eq 'account' || $runmode eq 'save-acct'
              ? 'bm-account.cgi' : 'bm-config.cgi';
        }
        elsif ($users && !$sites) { # still need to do 1st site
            $script =  'bm-config.cgi';
            $runmode = 'first-site' if $runmode !~ /^ajax/;
        }
        
        if ($script) {
            my $url = $app->build_url( script => $script, rm => $runmode );
            $app->header_type('redirect');
            $app->header_props( -url => $url );
            print $app->_send_headers();
            $app->teardown();
            exit;
        }
    }
    elsif ($runmode eq 'account' || $runmode eq 'save-acct') {
        $app->prerun_mode('about-you'); #no moxiedir, not ready yet
    }
}

###########################################################
# RUN MODES
###########################################################

sub rm_about_you {
    my $app     = shift;
    my %options = @_;
    $options{head} ||= 'START_Big_Medium_Setup_Wizard_Title';
    $options{message} ||= 'START_Welcome_Message';
    $options{show_steps} ||= 1;
    $options{submit_text} ||= 'START_Submit_Button_Text';
    $options{form_url} ||= $app->build_url(script=>'bm-start.cgi', rm=>'about-verify');
    $options{template} ||= 'screen_start_generic.tmpl';
    BigMed::App::Web::Config::rm_about_you($app, %options);
}

sub rm_about_verify {
    my $app     = shift;
    my %options = @_;
    $options{prev_screen_ref} = \&rm_about_you;
    $options{next_screen_ref} = \&rm_server;
    BigMed::App::Web::Config::rm_about_verify($app, %options);
}

sub rm_server {
    my $app     = shift;
    my %options = @_;
    $options{head} ||= 'START_Server_Info_Title';
    $options{message} ||= 'START_Server_Info_Message';
    $options{form_url} ||= $app->build_url(script=>'bm-start.cgi', rm=>'server-verify');
    $options{show_steps} ||= 1;
    $options{submit_text} ||= 'START_Submit_Button_Text';
    $options{template} ||= 'screen_start_generic.tmpl';
    BigMed::App::Web::Config::rm_server($app, %options);
}

sub rm_server_verify {
    my $app     = shift;
    my %options = @_;
    $options{prev_screen_ref} = \&rm_server;
    $options{next_screen_ref} = \&rm_first_account;
    BigMed::App::Web::Config::rm_server_verify($app, %options);
}

sub rm_first_account {
    my $app     = shift;
    my %options = @_;
    $options{first_account} = 1;
    $options{head} ||= 'START_Admin_Acct';
    $options{message} ||= 'START_Admin_Acct_Message';
    $options{form_url} ||= $app->build_url(script=>'bm-start.cgi', rm=>'save-acct');
    $options{template} ||= 'screen_start_generic.tmpl';
    $options{submit_text} ||= 'START_Submit_Button_Text';
    $options{user} = BigMed::User->new();
    $options{user}->set_email($app->env('ADMINEMAIL'));
    BigMed::App::Web::Account::rm_edit_account($app, %options);
}

sub rm_save_account {
    my $app     = shift;
    my %options = @_;
    $options{first_account} = 1;
    $options{prev_screen_ref} = \&rm_first_account;
    $options{next_screen_ref} = \&_login_first_account;
    $options{template} ||= 'screen_start_generic.tmpl';
    BigMed::App::Web::Account::rm_save_account($app, %options);
}

sub rm_ajax_verify_dir {
    BigMed::App::Web::Config::rm_ajax_verify_dir($_[0]);
}

sub _login_first_account {
    my $app = shift;
    my %options = @_;
    my $user = $options{user};
    
    #kill the start.pm app and create a new login-based
    #config.pm app, logging in with the new user account.
    #the same run mode name and params are still in effect
    #(should be save-acct).
    $app->teardown();
    my $config = BigMed::App::Web::Config->new(
        params => {
            'LOGIN_force' =>
              { name => $user->name, hash_pass => $user->password },
        }
    );
    $config->run;
    exit;
}

1;

