# @todo: fill according to your needs
set ::reviewers_by_author(author) reviewer
# 
#
##################################################################################################################################
#
# @todo: fill according to your needs
set ::reviewers_by_ext(.ext) reviewer
#
##################################################################################################################################
# map the author to email address
proc get_email {name} {
    # @todo: replace yourserver.com by your mail server address if needed.
    return [format {%s@yourserver.com} $name]
}
#
##################################################################################################################################
#
proc get_reviewer_by_ext {ext} {
    set ext [string tolower $ext]
    if {[info exists ::reviewers_by_ext($ext)]} {
        return $::reviewers_by_ext($ext)
    } else {
        return [list]
    }
}
#
##################################################################################################################################
#
proc get_reviewer_by_author {author} {
    set author [string tolower $author]
    if {[info exists ::reviewers_by_author($author)]} {
        return $::reviewers_by_author($author)
    } else {
        return [list]
    }
}
#
##################################################################################################################################
#
proc guess_reviewers {message author files} {
    set reviewers [get_reviewer_by_author $author]
    foreach file $files {
        set reviewers [concat $reviewers [get_reviewer_by_ext [file extension $file]]]
    }
    set reviewers [lsort -uniq $reviewers]    
    set result    [list]
    foreach r $reviewers {
        if {[string compare -nocase $r $author]} {
            lappend result [get_email $r]
        }
    }
    if {0 == [llength $result]} { 
        set result [get_email "ctaboch"]
    }
    return $result
}
#
##################################################################################################################################
#
proc get_branch {files} {
    #@todo: find your own way to give a names to the branches
    # this is just an example
    if {0 != [llength $files]} {
        set branch [string range [lindex $files 0] 4 end]
        set branch [lindex [split $branch "/"] 0]
    } else {
        set branch ""
    }

    return $branch
}
#
##################################################################################################################################
#
proc codestrike_submit_revision {revision message author files} {    
    set branch                  [get_branch $files]
    if {"" == $branch} {
        return
    }
    set topic                   [format {%s@%s by %s: %s...} $revision $branch $author [string range $message 0 50]]
    set topic_description       $message
    set email                   [get_email $author]
    set bug_ids                 {}
    set reviewers               [join [guess_reviewers $message $author $files] ","]
    set from_revision           [expr $revision - 1]
    set to_revision             $revision
    return [codestrike_submit {/} $topic $topic_description 3 $bug_ids $email $reviewers "$::ALWAYS_CC" $from_revision $to_revision]
}
#
##################################################################################################################################
#
# @test
#~ set tag [codestrike_submit_revision 11624 "message" "author" [list f1.cpp f2.java f3.dil]]
#~ puts tag:$tag
#~ return 
proc codestrike_submit {module topic_title topic_description project_id bug_ids email reviewers cc start_tag end_tag} {
    package require http
    # @todo replace your_codestriker_server by the real server name
    set base_url {http://your_codestriker_server/codestriker/codestriker.pl?action=submit_new_topic}
    set query [list]
    #~ lappend query topic_file            {}
    lappend query module                $module
    lappend query topic_title           $topic_title
    lappend query topic_description     $topic_description
    lappend query project_id            $project_id
    #~ lappend query bug_ids               $bug_ids
    lappend query email                 $email
    lappend query reviewers             $reviewers
    lappend query cc                    $cc
    lappend query start_tag             $start_tag
    lappend query end_tag               $end_tag
    #
    foreach {field value} $query {
        append suffix [format {&%s=%s} $field [http::formatQuery $value]]
    }
    set url   [format {%s%s} $base_url $suffix]
    puts $url
    set token [http::geturl $url]
    set data  [::http::data $token]    
    # attempt to check result
    set result [regsub {.*Topic URL:(.*)\n<P>.*} $data {\1} htmltag]
    if {1 == $result} {
        return $htmltag
    } else {
        error "Cannot create topic: $url"
    }
}
#
##################################################################################################################################
#
proc main {argv} {
    set rev         [lindex $argv 0]
    set repo        [lindex $argv 1]
    set svninfo_out [split [exec svnlook info -r $rev $repo] "\n"]
    set user [lindex $svninfo_out 0]
    set date [lindex $svninfo_out 1]
    set prev [lindex $svninfo_out 2]
    set mesg [join [lrange $svninfo_out 3 end] "\n"]
    set files [split [exec svnlook changed -r $rev $repo] "\n"]
    set tag [codestrike_submit_revision $rev $mesg $user $files]
    puts $tag
}
#
##################################################################################################################################
#
puts "NORMAL:$argv"
set exception [catch {main $::argv} errorMsg]
set localErrorInfo $::errorInfo
if {0 != $exception} {
    puts "ERROR:$errorMsg"
    puts $::argv
    puts $localErrorInfo
    return 1
} else {
    puts "NORMAL:$errorMsg"
    return 0
}
