use strict;
use warnings;

package DiveMalta::Dispatcher;
use Jifty::Dispatcher -base;

before 'admin' => run {
    if ( !Jifty->web->current_user->id ) {
        tangent '/login';
    }
};

before '*' => run {
    eval { Jifty::Plugin::DumpDispatcher->dump_rules };
};

under 'admin' => [
    run {
        Jifty->log->info("In admin section of dispatcher");
    },
    on '*' => run {
        Jifty->log->info("showing admin page for $1");
        set model => "\u$1";
        show '/admin/list';
    },
    on '*/create' => run {
        my @fields = ();
        set fields => \@fields;
        set model => "\u$1";
        set class => "Create";
        show "/admin/create_or_update";
    },
    on 'fragments/page_of' => run {
        my $model = get('model');
        my @fields = ();
        my @nosort = ();
        if ($model eq 'Course') {
            @fields = qw(name min_age price duration shortdesc);
        }
        elsif ($model eq 'Coursematerial') {
            @fields = qw(name price);
        }
        elsif ($model eq 'Courseprereq') {
            @fields = qw(name);
            set sort_by => 'name';
        }
        elsif ($model eq 'Divesite') {
            @fields = qw(name description maxdepth certification.name);
            @nosort = qw(certification.name);
        }
        elsif ($model eq 'Imagemap') {
            @fields = qw(name course.name);
            @nosort = qw(course.name);
        }
        elsif ($model eq 'News') {
            @fields = qw(title created content);
            set sort_by => 'created';
            set order => 'descending';
        }
        elsif ($model eq 'Photo') {
            @fields = qw(thumb sizes title created photographer divesite.name);
            @nosort = qw(thumb sizes divesite.name);
            set sort_by => 'title';
            set per_page => 10;
        }
        elsif ($model eq 'Staff') {
            @fields = qw(photo.thumb name priority active);
            @nosort = qw(photo.thumb);
            set sort_by => 'name';
            set per_page => 10;
        }
        elsif ($model eq 'User') {
            @fields = qw(name email mygroup email_confirmed);
            set sort_by => 'name';
            set order => 'ascending';
            set nocreate => 1;
        }
        set fields => \@fields;
        set nosort => \@nosort;
        show '/admin/fragments/page_of';
    },
    on '*/*/*' => run {
        my ( $model, $op, $id ) = ( $1, $2, $3 );
        my @fields;
        set model => "\u$model";
        set id => $id;
        set fields => \@fields;
        if ( $op =~ /^(edit|update)$/i ) {
            set class => 'Update';
            show "/admin/create_or_update";
        }
        elsif ( $op =~ /^delete$/i ) {
            my $model   = get 'model';
            my $fqmodel = Jifty->app_class('Model', $model);
            my $record  = $fqmodel->load($id);
            if ( $record->id ) {
                $record->delete;
            }
            dispatch "/admin/\l$model";
        }
    },
];

under 'course' => [
    on 'tec' => run {
        set name => 'TecCourse';
        show "/course";
    },
    on 'flowchart' => run {
        show "/course/flowchart";
    },
    on '*' => run {
        Jifty->log->info("showing course page for $1");
        my $name   = $1;
        $name =~ s/_/ /g;

        my $course = Jifty->app_class('Model', 'Course')->new;
        $course->load_by_cols( name => $name );

        if ( $course->id ) {
            set id => $course->id;
            show "/course/by_id";
        }
        else {
            show "/errors/404";
        }
    },
];

under 'feed' => [
    on '' => run {
        show '/errors/404';
    },
    on qr{^(Atom|RSS)} => run {
        set type => $1;
        show '/feed';
    },
];

under 'fragments' => [
    on '' => run {
        show '/errors/404';
    },
    on 'news' => run {
        show '/fragments/news';
    },
    on 'newsitem' => run {
        show '/fragments/newsitem';
    },
    on '**' => run {
        show '/errors/404';
    },
];

under 'gallery' => [
    run {
        default model => Jifty->app_class('Model', 'Photo');
    },
    on 'photo' => run {
        my $id = get('id');
        Jifty->log->info("showing photo for $id");
        my $photo = get('model')->new();
        $photo->load($id);
        show '/errors/404' if ! $photo->id;
        show '/gallery/photo';
    },
];

under 'news' => [
    run {
        default model => Jifty->app_class('Model', 'News');
    },
    on '*' => run {
        my $id = $1;
        my $record = get('model')->new();
        $record->load($id);
        if ( $record->id ) {
            set id   => $id;
            show "/newsitem";
        } else {
            show "/error/404";
        }
    },
];

under 'photo' => [
    run {
        default model => Jifty->app_class('Model', 'Photo');

    },
    on '' => run {
        show '/gallery';
    },
    on 'maxheight/*/*.*' => run {
        my ( $size, $id, $type ) = ( $1, $2, $3 );
        my $record = get('model')->new();
        $record->load($id);
        if ( $record->id && $record->type eq $type ) {
            set id        => $id;
            set maxheight => $size;
            show "/photo";
        }
        else {
            show "/error/404";
        }
    },
    on '*/*.*' => run {
        my ( $size, $id, $type ) = ( $1, $2, $3 );
        my $record = get('model')->new();
        $record->load($id);
        if ( $record->id && $record->type eq $type ) {
            set id   => $id;
            set size => $size;
            set type => $type;
            show "/photo";
        }
        else {
            show "/error/404";
        }
    },
];

on 'sitemap.*' => run {
    my $type = $1;
    if ( $type eq "html" ) {
        show "sitemap";
    }
    elsif ( $type =~ /^xml/ ) {
        my $compressed = 0;
        if ( $type eq "xml.gz" ) {
            $compressed = 1;
        }
        set compressed => $compressed;
        show "xmlsitemap";
    }
    else {
        show "/error/404";
    }
};

1;
