/* <copyright                                       */
/* notice="cics-lm-source-program"                  */
/* pids="CA0U"                                      */
/* years="2014"                                     */
/* crc="1962844266" >                               */
/* 	Licensed Materials - Property of IBM            */
/* 	CA0U                                            */
/* 	(C) Copyright IBM Corp. 2014 All Rights Reserved. */
/* 	US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */
/* </copyright>                                     */
package com.ibm.cics.ucd.steps

import com.ibm.cics.core.model.CICSCore;
import com.ibm.cics.core.model.FilteredContext
import com.ibm.cics.core.model.GenTypeClasses
import com.ibm.cics.core.model.ICPSM
import com.ibm.cics.core.model.ProgramType
import com.ibm.cics.model.ICICSObject
import com.ibm.cics.model.ICICSType
import com.ibm.cics.sm.comm.IContext
import com.ibm.cics.sm.comm.SystemManagerActions
import com.ibm.cics.ucd.CPSMHelper
import com.ibm.cics.ucd.properties.IntegerProperty
import com.ibm.cics.ucd.properties.ResourceNameListPropertySupportWildCard
import com.urbancode.air.AirPluginTool;
import com.ibm.cics.ucd.exceptions.StepFailedException
import com.ibm.cics.ucd.msg.CICSUCDMessage
import java.text.MessageFormat

class NewcopyProgramStep extends CICSStep {
// <copyright 
// notice="cics-lm-java-class" 
// pids="CA0U" 
// years="2014" 
// crc="1962844266" > 
	static final String COPYRIGHT = "Licensed Materials - Property of IBM CA0U (c) Copyright IBM Corp. 2014 All Rights Reserved. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp."; //$NON-NLS-1$
// </copyright> 

	public NewcopyProgramStep(String inputPropertyFile, String outputPropertyFile) {
		this(inputPropertyFile, outputPropertyFile, CICSCore.getCPSM())
	}
	
	public NewcopyProgramStep(AirPluginTool apTool) {
		this(apTool, CICSCore.getCPSM())
	}

	/**
	 * Primarily to support unit testing
	 * @param cpsm
	 */
	NewcopyProgramStep(String inputPropertyFile, String outputPropertyFile, ICPSM cpsm) {
		super(inputPropertyFile, outputPropertyFile)
		this.cpsm = cpsm
	}
	
	NewcopyProgramStep(AirPluginTool apTool, ICPSM cpsm) {
		super(apTool)
		this.cpsm = cpsm
	}
	
	@Override
	protected void runCICSStep(ICPSM cpsm, IContext context) {
		Class<? extends ICICSType<ICICSObject>> typeClass = GenTypeClasses.getCICSTypeClassForResourceTableName("PROGRAM")
		ICICSType<?> type = typeClass.invokeMethod("getInstance", null)
		
		def props = apTool.getStepProperties()
		
		def programList = new ResourceNameListPropertySupportWildCard("Programs", ",", true).parse(props['programList']).getValue()
		def maxRetryTimes = new IntegerProperty("Max Retry Times", true).parse(props['maxRetryTimes']).getValue()
		def retryInterval = new IntegerProperty("Retry Interval", true).parse(props['retryInterval']).getValue()
		
		System.out.println("\nPerform NEWCOPY:\n")
		
		boolean stepFail = false
		int successCount = 0
		int failCount = 0
			
		//iterate to perform action on each program
		programList.each {
			
			def program = it
			FilteredContext filteredContext = new FilteredContext(context)
			filteredContext.setAttributeValue(ProgramType.NAME, program)
			def cpsmHelper = new CPSMHelper()
			boolean success = cpsmHelper.perform(cpsm, SystemManagerActions.NewCopy, type, filteredContext, program, maxRetryTimes, retryInterval)
			if (success)
				successCount++
			else {
				failCount++
				stepFail = true
			}
		}
		
		System.out.println(MessageFormat.format(CICSUCDMessage.resultSummary, CICSUCDMessage.newcopy, Integer.toString(successCount), Integer.toString(failCount)))
		
		if (stepFail) {
			throw new StepFailedException("Step failed.");
		}
		
	}

}
