# This module defines metadata to be used by the batchSVN.py script.
#
# Copy this module as /class/csse/<courseName>/scripts/batchSVNData.py and 
# edit it to define the course metadata for <courseName>.  The sample data
# in the original file can be used by invoking the batchSVN.py script using
# "testing" as the course name argument, e.g.: ./batchSVN.py testing
# ----------------------------------------------------------------

import os
import sys

# ----------------------------------------------------------------
# Hacks the system path so the import of batchSVNTypes works for testing 
# individual course meta-data on the the server.
serverPathToBatchSVN = "/class/csse/resources/Grading"
# Change the following line to point to your local checkout of the CSSE
# resources trunk if you want to test this file on your local machine:
#localMachinePathToBatchSVN = "/Users/cclifton/Documents/Rose/Administrative/resources/Grading"
sys.path.append(serverPathToBatchSVN)
#sys.path.append(localMachinePathToBatchSVN)
from batchSVNTypes import *
# ----------------------------------------------------------------

# ----------------------------------------------------------------
# Find out which term we want to use by displaying all the current
# folders, each named a different section.
# ----------------------------------------------------------------

pathToUse = "/class/csse/csse220/scripts/"

fileToNum = {}
count = 1
for each in os.listdir(pathToUse):
    inPath = os.path.join(pathToUse, each)
    if os.path.isdir(inPath) and each.startswith("2") and len(each.strip()) == 6:
        fileToNum[count] = each
        count += 1

if count > 1: #This means that there is at least one folder to use...
    print "For the following, choose the number that corresponds to the term you wish to use: "
    for k in fileToNum.iterkeys():
        print k, " for ", fileToNum[k]

    outputString = "Please enter your choice (1-" + str(count-1) + "): "

    done = False
    while not done:
        num = raw_input(outputString)
        if not num.isdigit() or int(num) < 1 or int(num) >= count:
            print "Incorrect input value choice! Must be (1-" + str(count-1) + "): "
        else:
            done = True
    #end while

    userChoice = fileToNum[int(num)]
    print "You chose " + userChoice

    # ----------------------------------------------------------------
    # Local variables
    # ----------------------------------------------------------------
    repoNamePrefix = 'csse220-' + userChoice + '-'
else:
    repoNamePrefix = 'csse220-201520-'
#end else/if


# replace the following with a description of the course, like 'CSSE 120'
courseDescription = 'CSSE 220 - Object-Oriented Software Dev.'

# ----------------------------------------------------------------
# Defines repositories sets for this course.  Used by main script.
# ----------------------------------------------------------------
if count > 1:
    fileToNum = {}
    countLoc = 1
    found = False
    prefName = "userlist.txt"
    curTempPath = '/class/csse/csse220/scripts/' + userChoice + '/'



    for each in os.listdir(curTempPath):
        inPath = os.path.join(curTempPath, each)
        if os.path.isfile(inPath) and str(each) == prefName:
            found = True
        elif os.path.isfile(inPath) and str(each).endswith(".txt"):
            fileToNum[countLoc] = each
            countLoc += 1
    #end for


    if not found:
        print "For the following, choose the number that corresponds to the file you wish to use: "

        for k in fileToNum.iterkeys():
                print k, " for ", fileToNum[k]

        outputString = "Please enter your choice (1-" + str(countLoc-1) + "), 0 to exit: "

        done = False
        while not done:
            num = raw_input(outputString)
            if not num.isdigit() or int(num) < 0 or int(num) >= countLoc:
                print "Incorrect input value choice! Must be (1-" + str(countLoc-1) + "): "
            else:
                done = True
        #end while

        if str(num) == "0":
            print "Since you are exiting without effectively doing anything, allow " +\
                  "this script to take a moment and remind you to set up the proper " +\
                  "folder and user list text file as described in the README.txt"
            sys.exit(1)
        #endif

        prefName = fileToNum[int(num)]
        print "You chose " + prefName
        
    else: #else the file 'userlist.txt' was found
        print "Using file name userlist.txt"
    #end else

    curTempPath += prefName
else: #else, there's no folder for any term
    print "No directory structure found, just attempting to find file \"userlist.txt\""
    curTempPath = '/class/csse/csse220/scripts/userlist.txt'
    userChoice = "201510" #just give a default
#end else

section1File = open(curTempPath, 'r')
allStudents = []
for line in section1File:
    allStudents.append(line.strip())
section1File.close()

# section1File = open('/class/csse/csse220/scripts/csse220-201510-users01.txt', 'r')
# section1Students = []
# for line in section1File:
#     section1Students.append(line.strip())
# section1File.close()

# section2File = open('/class/csse/csse220/scripts/csse220-201510-users02.txt', 'r')
# section2Students = []
# for line in section2File:
#     section2Students.append(line.strip())
# section2File.close()

# section3File = open('/class/csse/csse220/scripts/csse220-201510-users03.txt', 'r')
# section3Students = []
# for line in section3File:
#     section3Students.append(line.strip())
# section3File.close()

# allStudents = section1Students + section2Students + section3Students


reposSets = []
# first set in the list is the default

reposSets.append(RepositorySet("All Students", repoNamePrefix, allStudents))

# reposSets.append(RepositorySet("Section 1&2 - Hewner", repoNamePrefix, section1Students + section2Students))

# reposSets.append(RepositorySet("Section 3 - Defoe", repoNamePrefix, section3Students))

reposSets.append(RepositorySet("Game of Life", repoNamePrefix, [
"gameoflife01",
"gameoflife02",
"gameoflife03",
"gameoflife04",
"gameoflife05",
"gameoflife06",
"gameoflife07",
"gameoflife08",
"gameoflife09",
"gameoflife10",
"gameoflife11",
"gameoflife12",
"gameoflife13",
"gameoflife14",
"gameoflife15",
"gameoflife16",
"gameoflife17",
"gameoflife18",
"gameoflife19",
"gameoflife20",
"gameoflife21",
"gameoflife22",
"gameoflife23",
"gameoflife24",
"gameoflife25",
"gameoflife26",
"gameoflife27",
"gameoflife28",
"gameoflife29",
"gameoflife30",
"gameoflife31",
"gameoflife32",
"gameoflife33",
"gameoflife34",
"gameoflife35",
"gameoflife36",
"gameoflife37",
"gameoflife38",
"gameoflife39",
"gameoflife40",
"gameoflife41"
]))

reposSets.append(RepositorySet("Ballworlds", repoNamePrefix, [
    "BW01",
    "BW02",
    "BW03",
    "BW04",
    "BW05",
    "BW06",
    "BW07",
    "BW08",
    "BW09",
    "BW10",
    "BW11",
    "BW12",
    "BW13",
    "BW14",
    "BW15",
    "BW16",
    "BW17",
    "BW18",
    "BW19",
    "BW20",
    "BW21",
    "BW22",
    "BW23",
    "BW24",
    "BW25",
    "BW26",
    "BW27",
    "BW28",
    "BW29",
    "BW30",
    "BW31",
    "BW32",
    "BW33",
    "BW34",
    "BW35",
    "BW36"
]))

reposSets.append(RepositorySet("Loderunner", repoNamePrefix, [
    "LR01",
    "LR02",
    "LR03",
    "LR04",
    "LR05",
    "LR06",
    "LR07",
#    "LR08",
    "LR09",
    "LR10",
    "LR11",
    "LR12",
    "LR13",
    "LR14",
    "LR15",
    "LR16"
]))

reposSets.append(RepositorySet("Digger", repoNamePrefix, [
    "digger01",
    "digger02",
    "digger03",
    "digger04",
    "digger05",
    "digger06",
    "digger07",
    "digger08",
    "digger09",
    "digger10",
    "digger11",
    "digger12",
    "digger13",
    "digger14",
    "digger15",
    "digger16",
    "digger17",
    "digger18",
    "digger19",
    "digger20",
    "digger21",
    "digger22",
    "digger23",
    "digger24",
    "digger25",
    "digger26"
]))

# ----------------------------------------------------------------
# Defines project names and unit tests for this course. 
# Used by main script.
# ----------------------------------------------------------------
projects = []
projects.append(Project("HW1"))
projects.append(Project("TwelveProblems")) # Program from week 1
projects.append(Project("ObjectsAndMethods")) #HW2
projects.append(Project("UnitTesting", "StringMethodsPracticeTest", "JUnitMoveTester")) #HW3
projects.append(Project("TeamGradebook")) #HW4 and HW5
projects.append(Project("IntroToJavaGraphics")) #not graded, part of HW6
projects.append(Project("Faces")) #HW6
projects.append(Project("SixMapAnd2DArrayProblems")) #HW6
projects.append(Project("Decisions")) #HW6
projects.append(Project("FundamentalDataTypes")) #HW7 for Boutell
projects.append(Project("Iteration", "AnnualInvestmentTest", "InvestmentTest")) #HW7
projects.append(Project("ArraysAndLists", "QuizScoresTest")) #HW8
projects.append(Project("TwoDArrays", "TicTacToeTest", "TicTacToeTestFromInstructors")) #HW10, individual
projects.append(Project("GameOfLife", "GameOfLifeTest")) #HW10, team0's
projects.append(Project("EnscapsulationExamples"))

#Show exam of choice term 
projects.append(Project(str("Exam1-" + userChoice))) #defaults to 201510
projects.append(Project(str("Exam2-" + userChoice))) #same
projects.append(Project(str("Final-" + userChoice))) #same
projects.append(Project("Recursion","examples.SentenceTest")) #HW12
projects.append(Project("SierpinskiTriangle")) #HW12
projects.append(Project("Recursion2")) #HW13
projects.append(Project("RecursionPractice"))
projects.append(Project("LinearLightsOut"))
projects.append(Project("SortingAndSearching")) #HW14
projects.append(Project("FunctionObjects")) #HW??
projects.append(Project("ForkJoinIntro")) #HW15
projects.append(Project("DesigningClasses")) #HW16
projects.append(Project("OnToInterfaces", "bigRational.BasicBigRationalTest", "bigRational.LargeBigRationalTest")) #HW17
projects.append(Project("EventBasedProgramming")) #HW18
projects.append(Project("Inheritance")) #HW19, LinearLightsOut
#projects.append(Project("Inheritance2")) #HW20, but nothing to grade
#projects.append(Project("SwingDemo2")) #HW16
projects.append(Project("BallWorlds")) #HW20
projects.append(Project("OODesign")) #HW21
#projects.append(Project("Exam2", "problem1.CompareProblemTest", "problem2.MultiplierTest"))
projects.append(Project("VectorGraphics"))
projects.append(Project("TextTwisterMIDlet"))
projects.append(Project("StrategyPattern"))
projects.append(Project("LinkedLists")) #HW24
projects.append(Project("SinglyLinkedList"))
projects.append(Project("DataStructures")) #HW25
#projects.append(Project("Exam2MakeUp"))
projects.append(Project("FixedLengthQueue")) #HW25
projects.append(Project("AnimatedShapes")) #Exam 3 optional
projects.append(Project("LodeRunner")) #HW25
projects.append(Project("Digger")) 
projects.append(Project("Markov", "Milestone1Tests", "Milestone2Tests"))
#projects.append(Project("FinalExam"))

# ----------------------------------------------------------------
# Defines any additional main menu commands for this course.
# Used by main script.
# ----------------------------------------------------------------
menuItems = []
# ----------------------------------------------------------------
# A couple of extra menu items that are useful in a pinch, but aren't yet 
# sufficiently abstracted for general use.
# def copyInExtras(data):
#     forEachRepo("cp ${scriptDir}/*.java ${shortName}/src/btwp/", data)
#     return False
# menuItems.append(MenuItem('Copy in Exam2 test files',copyInExtras))
# 
# def runTestsExtraMem(data):
#     forEachRepo("cd ${shortName} && java -Xmx2000m -cp '${scriptDir}/junit-4.5.jar:bin' org.junit.runner.JUnitCore ${testClasses}", data)
#     return False
# menuItems.append(MenuItem('Run JUnit tests with extra memory',runTestsExtraMem))
# ----------------------------------------------------------------
   


# ----------------------------------------------------------------
# Some test code, executed if this file is imported directly into
# a python shell.  Shouldn't need to change this when specifying
# course-specific data above.
# ----------------------------------------------------------------
if __name__ == '__main__':
    print "reposSets ==", reposSets
    print "Repositories from reposSets[0]:"
    for r in reposSets[0].repos():
        print "   ", r
    print "repository names: ", [r.name for r in reposSets]
    print
    print projects
    print "Test classes:"
    for p in projects:
        print "   %s: %s" % (p.name, p.testClasses)
    print "Additional Menu Items' Text:"
    for mi in menuItems:
        print "  ", mi.text