//
        // GET: /ReopenRate/
        public ActionResult Index(string project)
        {
            _jss = new JiraSoapServiceService();
            _token = _jss.login(_jiraUsername, _jiraPassword );
            string projectId;

            project = Util.nvl(project, "DPS");

            // Get Project ID
            List<RemoteProject> projects = HttpRuntime.Cache.GetOrStore<List<RemoteProject>>("projects", 3600, () => _jss.getProjectsNoSchemes(_token).ToList());
            projectId = projects.Find(p => p.key == project).id;

            // Get Versions, limit to ones we care about
            List<RemoteVersion> versions = HttpRuntime.Cache.GetOrStore<List<RemoteVersion>>("versions-"+project, 3600, () => _jss.getVersions(_token, project).ToList());
            versions = versions.Where(v => !v.archived && (!v.released || v.releaseDate > DateTime.Now.AddDays(-90))).OrderBy(v => v.sequence).ToList();

            // Populate version list
            var rlist = new List<ReopenRateVersion>();
            foreach (var v in versions)
            {
                ReopenRateVersion r = new ReopenRateVersion() { VersionId = v.id, VersionName = v.name };
                rlist.Add(r);
            }
            rlist.Add(new ReopenRateVersion() { VersionId = "", VersionName = "None" });

            // Enrich version list with data from DB (not available in API)
            JiraRepository rc = new JiraRepository();
            rc.GetReopenRates(projectId, ref rlist);

            return View(rlist);
        }
        public ActionResult Scope(string project)
        {
            string projectId = "";
            project = Util.nvl(project, "URM");
            _jss = new JiraSoapServiceService();
            _token = _jss.login(_jiraUsername, _jiraPassword);

            // Get Project ID
            List<RemoteProject> projects = HttpRuntime.Cache.GetOrStore<List<RemoteProject>>("projects", 3600, () => _jss.getProjectsNoSchemes(_token).ToList());
            RemoteProject proj = projects.Find(p => p.key == project);
            if (proj != null)
            {
                projectId = proj.id;
                ViewData["projectName"] = proj.key; // proj.description; // not ideal; will do a ViewModel if we have more properties
            }
            else
            {
                return View("Error", new ErrorInfoViewModel() { ErrorMessage = String.Format("Project does not exist")}); 
            }

            JiraRepository rc = new JiraRepository();
            List<ScopingVersion> l = rc.GetScoping(projectId);

            return View(l);
        }
        //
        // GET: /RoadMapGadget/
        public ActionResult Index(string project, string username)
        {
            _jss = new JiraSoapServiceService();
            _token = _jss.login(_jiraUsername, _jiraPassword);

            project = Util.nvl(project, "DPS");

            // Get Project List from cache and get project for specified input
            List<RemoteProject> projects = HttpRuntime.Cache.GetOrStore<List<RemoteProject>>("projects", 3600, () => _jss.getProjectsNoSchemes(_token).ToList());
            
            // Define view model
            RoadMapGadgetViewModel vm = new RoadMapGadgetViewModel();
            vm.project = projects.First(p => p.key == project);
            
            // Get data from DB (can't get from API)
            JiraRepository rc = new JiraRepository();
            vm.versions = rc.GetRoadMapVersions(vm.project.id, username);
            return View(vm);
        }
        public JsonResult GetTravel(string projectKey)
        {
            JiraRepository rc = new JiraRepository();

            //var travel = HttpRuntime.Cache.GetOrStore<IEnumerable<Trip>>("travel", 3600, () => rc.GetTravel());
            var travel = rc.GetTravel();

            var travelList = from t in travel
                             where t.ProjectKey == projectKey
                             select new
                             {
                                 id = t.IssueKey,
                                 start = t.StartDate.ToString("s"),
                                 end = t.EndDate.ToString("s"),
                                 allDay = true,
                                 title = String.Format("{0} ({1})", t.Description, t.Traveller)
                             };

            var rows = travelList.ToArray();
            return Json(rows, JsonRequestBehavior.AllowGet);    

        }
        public ActionResult Index(string project)
        {
            string projectId = "";
            project = Util.nvl(project, "URM");
            _jss = new JiraSoapServiceService();
            _token = _jss.login(_jiraUsername, _jiraPassword);

            // Get Project ID
            List<RemoteProject> projects = HttpRuntime.Cache.GetOrStore<List<RemoteProject>>("projects", 3600, () => _jss.getProjectsNoSchemes(_token).ToList());
            RemoteProject proj = projects.Find(p => p.key == project);
            if (proj != null)
            {
                projectId = proj.id;
                ViewData["projectName"] = proj.key; // proj.description; // not ideal; will do a ViewModel if we have more properties
            }
            // TODO: else redirect to error
            
            JiraRepository rc = new JiraRepository();
            ManpowerViewModel vm = new ManpowerViewModel();
            vm.AllocatedWork = rc.GetManpower(projectId, true);
            vm.NonAllocatedWork = rc.GetManpower(projectId, false);

            return View(vm);
        }
 public InstallationsCalendarController()
 {
     rc = new JiraRepository();
 }
        /// <summary>
        /// Returns a google chart of issues burndown for a specified version
        /// </summary>
        /// <param name="projectKey">Project Key, eg. DPS</param>
        /// <param name="version">Name of the desired version</param>
        /// <param name="refresh">Refresh parameter for chart- options are a number of minutes, or "now" to remove the cache</param>
        /// <returns></returns>
        public ActionResult IssuesBurndownChart(string projectKey, string version, string refresh)
        {
            try
            {
                int i;
                _jss = new JiraSoapServiceService();
                _token = _jss.login(_jiraUsername, _jiraPassword);

                string versionId="";

                if (String.IsNullOrEmpty(projectKey))
                    return View("Error", new ErrorInfoViewModel() { ErrorMessage = "Please select a project" });

                // Agile or Regular?
                if (!int.TryParse(projectKey, out i))
                {
                    // Get relevant version
                    List<RemoteVersion> versions = HttpRuntime.Cache.GetOrStore<List<RemoteVersion>>("versions-" + projectKey, 3600, () => _jss.getVersions(_token, projectKey).ToList());
                    try
                    {
                        versionId = versions.Find(v => v.name == version).id;
                    }
                    catch (NullReferenceException)
                    {
                        return View("Error", new ErrorInfoViewModel() { ErrorMessage = String.Format("Version does not exist in project {0}.", projectKey) });
                    }
                }

                // Handle refresh - options are now or a value in minutes
                int refreshMinutes;
                handleRefreshParameter(Request.QueryString["refresh"], "sprint-" + version, out refreshMinutes);

                // Populate View Model parameters
                JiraRepository rc = new JiraRepository();
                IssuesBurndownChartViewModel vm = new IssuesBurndownChartViewModel();
                vm.Title = String.Format("Issues Burndown Chart for {0}", version);
                vm.Refresh = refreshMinutes;
                vm.Sprint = HttpRuntime.Cache.GetOrStore<JiraSprint>("sprint-" + version, 60 * 45, () => String.IsNullOrEmpty(versionId) ? 
                    rc.GetBugsForAgileSprint(projectKey, version) : rc.GetBugsForSprint(projectKey, versionId, version));

                return View(vm);
            }
            catch (Exception ex)
            {
                return View("Error", new ErrorInfoViewModel() { ErrorMessage = String.Format("An unexpected error has occurred ({0}).", ex.Message), Refresh = 15 }); 
            }
        }