@isTest
public class PCLLostReportControllerTest {
	@testSetup
	private static void testSetup(){
		PCLLostProduct2AssetHandlerTest.setUp();
	}

	@isTest
	private static void TestInit_Create(){
		// create Test
		Opportunity opp1 = [select id from Opportunity limit 1];
		PageReference page =new PageReference('/apex/PCLLostReportPage?oppId='+opp1.Id+ '&pageStatus=Create' + +'&lostType=失单');
		page.setRedirect(true);
		System.Test.setCurrentPage(page);
		Lost_cancel_report__c lcr1 = new Lost_cancel_report__c();
		PCLLostReportController conTest =new PCLLostReportController(new ApexPages.StandardController(lcr1));
		conTest.init();
	}

	@isTest
	private static void TestInit_Edit(){
		EditLoad();
	}


	// 页面的数据结构
	public class LostReport {
		public Lost_cancel_report__c lostReport { get; set; }
		public list<LostBrand> LostBrands { get; set; }
		public LostReport(){
			lostReport = new Lost_cancel_report__c();
			LostBrands = new list<LostBrand> {new LostBrand(0)};
		}
		public LostReport(Lost_cancel_report__c lostReport){
			this.lostReport = lostReport;
			LostBrands = new list<LostBrand> {new LostBrand(0)};
		}
		public LostReport(Lost_cancel_report__c lostReport,  list<LostBrand> LostBrands){
			this.lostReport = lostReport;
			this.LostBrands = LostBrands;
		}
	}

	public class LostBrand {
		public PCLLostBrand__c lostBrand { get; set; }
		public Integer lineNo { get; set; }
		public list<PCLLostProducts> LostProducts { get; set; }
		public Integer ProductSize {get; set;}
		public LostBrand( integer lineNo ){
			lostBrand = new PCLLostBrand__c();
			this.lineNo = lineNo;
			LostProducts = new list<PCLLostProducts> {new PCLLostProducts()};
			ProductSize = 1;
			lostBrand = new PCLLostBrand__c();
		}
		public LostBrand( integer lineNo, list<PCLLostProducts> LostProducts ){
			lostBrand = new PCLLostBrand__c();
			this.lineNo = lineNo;
			this.LostProducts = LostProducts;
			ProductSize = LostProducts.size();
		}
		public LostBrand( integer lineNo, list<PCLLostProducts> LostProducts,  PCLLostBrand__c lostBrand){
			this.lostBrand = lostBrand;
			this.lineNo = lineNo;
			this.LostProducts = LostProducts;
			ProductSize = LostProducts.size();
		}
	}

	public class PCLLostProducts {
		public Integer lineNo2 { get; set; }
		public PCLLostProduct__c LostProductss { get; set; }

		public PCLLostProducts() {
			this.lineNo2 = 0;
			this.LostProductss=new PCLLostProduct__c();
		}

		public PCLLostProducts(Integer lineNo2) {
			this.lineNo2 = lineNo2;
			this.LostProductss=new PCLLostProduct__c();
		}

		public PCLLostProducts(Integer lineNo2,PCLLostProduct__c LostProductss) {
			this.lineNo2 = lineNo2;
			this.LostProductss=LostProductss;
		}
	}

	@isTest
	private static void TestInit_Other(){
		Lost_cancel_report__c lcr =[select id from Lost_cancel_report__c where LostType__c = '部分失单' limit 1];
		PageReference page2 =new PageReference('/apex/PCLLostReportPage?Id='+lcr.Id+ '&pageStatus=Edit');
		page2.setRedirect(true);
		System.Test.setCurrentPage(page2);
		PCLLostReportController conTest2 =new PCLLostReportController(new ApexPages.StandardController(lcr));
		conTest2.init();

		page2 =new PageReference('/apex/PCLLostReportPage?pageStatus=Create');
		page2.setRedirect(true);
		System.Test.setCurrentPage(page2);
		conTest2 =new PCLLostReportController(new ApexPages.StandardController(lcr));
		conTest2.init();

		page2 =new PageReference('/apex/PCLLostReportPage?oppId='+lcr.Id+ '&pageStatus=Create');
		page2.setRedirect(true);
		System.Test.setCurrentPage(page2);
		conTest2 =new PCLLostReportController(new ApexPages.StandardController(lcr));
		conTest2.init();

		page2 =new PageReference('/apex/PCLLostReportPage?pageStatus=Edit');
		page2.setRedirect(true);
		System.Test.setCurrentPage(page2);
		conTest2 =new PCLLostReportController(new ApexPages.StandardController(lcr));
		conTest2.init();

		page2 =new PageReference('/apex/PCLLostReportPage');
		page2.setRedirect(true);
		System.Test.setCurrentPage(page2);
		conTest2 =new PCLLostReportController(new ApexPages.StandardController(lcr));
		conTest2.init();
		List<PCLLostProducts> plpList=new List<PCLLostProducts>();
		for (PCLLostProducts variable : plpList) {
			PCLLostProducts plp=new PCLLostProducts();
			plp.lineNo2=0;
			plp.LostProductss=new PCLLostProduct__c();
			plpList.add(plp);
		}
		PCLLostReportController.LostReport a =new PCLLostReportController.LostReport();
		// PCLLostReportController.LostBrand ab =new PCLLostReportController.LostBrand(0,plpList);
	}

	public static PCLLostReportController EditLoad(){
		// View Edit Test
		Lost_cancel_report__c lcr2 =[select id from Lost_cancel_report__c where LostType__c = '失单' limit 1];
		PageReference page2 =new PageReference('/apex/PCLLostReportPage?Id='+lcr2.Id + '&pageStatus=Edit');
		page2.setRedirect(true);
		System.Test.setCurrentPage(page2);
		PCLLostReportController conTest2 =new PCLLostReportController(new ApexPages.StandardController(lcr2));
		conTest2.init();
		return conTest2;
	}

	@isTest
	private static void TestaddBrandAndProduct(){
		PCLLostReportController conTest2 = EditLoad();
		conTest2.addBrand();
		conTest2.addProduct();
		conTest2.RemoveBrandNo = 1;
		conTest2.Remove();
	}

	@isTest
	private static void TestCancel(){
		PCLLostReportController conTest2 = EditLoad();
		conTest2.cancel();
	}

	@isTest
	private static void TestSave(){
		PCLLostReportController conTest2 = EditLoad();
		conTest2.save();
	}

	@isTest
	private static void TestSearch(){
		Product2 prdone = new Product2();
		prdone.ProductCode_Ext__c= 'HistoryPrdone';
		prdone.ProductCode= 'HistoryPrdone';
		prdone.Repair_Product_Code__c = 'HistoryPrdone_RP';
		prdone.Name= 'HistoryPrdone';
		prdone.Manual_Entry__c= true;
		prdone.Category5__c = '竞争对手';
		// prdone.Lost_By_Company__c = 'STORZ';
		// tcm start
		Product2 prdtwo =prdone.clone();
		prdtwo.ProductClass__c='主机';
		prdtwo.ProductCategory__c='4K';
		prdtwo.Name= 'HistoryPrdtwo';
		prdtwo.ProductCode_Ext__c= 'HistoryPrdtwo';
		prdtwo.ProductCode= 'HistoryPrdtwo';
		// prdtwo.Lost_By_Company__c='STORZ';

		insert new List<Product2> {prdone,prdtwo};
		PCLLostReportController conTest2 = EditLoad();
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.LostProduct__c=null;
		conTest2.topNum=0;
		conTest2.secondNum=0;
		conTest2.search();

		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.LostProduct__c=prdtwo.Id;
		conTest2.topNum=0;
		conTest2.secondNum=0;
		conTest2.search();
		// tcm end
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.LostProduct__c=prdone.Id;
		conTest2.topNum=0;
		conTest2.secondNum=0;
		conTest2.search();
	}

	@isTest
	private static void DataCheck(){
		PCLLostReportController conTest2 = EditLoad();
		conTest2.LostReport.LostReport.LostType__c = null;
		conTest2.LostReport.LostBrands[0].lostBrand.LostPrice__c = null;
		conTest2.LostReport.LostBrands[0].lostBrand.Lost_reason_main__c = null;
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.Quantity__c =null;
		conTest2.LostReport.LostBrands[0].lostBrand.Agency__c = null;
		conTest2.DataCheck();
		conTest2.LostReport.LostBrands[0].lostBrand.Lost_By_Company__c = null;
		conTest2.DataCheck();
		conTest2.LostReport.LostBrands[0].LostProducts[0].lineNo2 = 1;
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss = new PCLLostProduct__c(Quantity__c = 0);
		conTest2.DataCheck();
	}

	@isTest
	private static void TestEdit2(){
		PCLLostReportController conTest2 = EditLoad();
		conTest2.edit2();
	}

	@isTest
	private static void TestSubmit(){
		PCLLostReportController conTest2 = EditLoad();
		conTest2.submit();
	}


	// add tcm 20211213 start
	@isTest
	private static void TestMeth1(){
		PCLLostReportController conTest2 = EditLoad();
		conTest2.LostReport.LostReport.LostType__c = 'test1';
		conTest2.LostReport.LostBrands[0].lostBrand.LostPrice__c = 12;
		conTest2.LostReport.LostBrands[0].lostBrand.Lost_reason_main__c = 'test2';
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.Quantity__c =11;
		conTest2.LostReport.LostBrands[0].lostBrand.Agency__c = null;
		conTest2.LostReport.LostBrands[0].lostBrand.Lost_By_Company__c = 'STORZ';
		conTest2.setBrandNo = 0;
		conTest2.setBrand();
		conTest2.LostReport.LostBrands[0].LostProducts[0].lineNo2 = 0;
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss = new PCLLostProduct__c(Quantity__c = 0);
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.LostProductMannual__c = 'test_lost_prod';

		conTest2.brandcopy();
		conTest2.dataEntry();
		conTest2.save();
	}



	@isTest
	private static void TestMeth2(){

		// recode type を取得
		List<RecordType> rectCo = [select Id from RecordType where IsActive = true and SobjectType = 'Account' and Name = '病院'];
		if (rectCo.size() == 0) {
			throw new ControllerUtil.myException('not found 病院 recodetype');
		}
		List<RecordType> rectDpt = [select Id, Name from RecordType where IsActive = true and SobjectType = 'Account' and Name IN ('診療科 消化科', '診療科 呼吸科') order by Name desc];
		if (rectDpt.size() == 0) {
			throw new ControllerUtil.myException('not found 診療科 recodetype');
		}

		// insert
		Account company1 = new Account();
		company1.RecordTypeId = rectCo[0].Id;
		company1.Name = '病院テスト1';
		insert company1;

		List<Account> dc1s = [Select Id, Name, Department_Class_Label__c, Sys_Dept_Name_Change_Chk__c from Account where Parent.Id = : company1.Id order by Department_Class_Label__c];

		Account depart1 = new Account();
		depart1.RecordTypeId = rectDpt[0].Id;
		depart1.Name = '*';
		depart1.Department_Name__c  = '診療科1';
		depart1.ParentId= dc1s[0].Id;
		depart1.Department_Class__c = dc1s[0].Id;
		depart1.Hospital__c= company1.Id;
		insert depart1;

		PCLLostReportController conTest2 = EditLoad();
		conTest2.LostReport.LostReport.LostType__c = '失单';
		conTest2.LostReport.LostBrands[0].lostBrand.LostPrice__c = 12;
		conTest2.LostReport.LostBrands[0].lostBrand.Lost_reason_main__c = '价格';
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.Quantity__c =3;
		conTest2.LostReport.LostBrands[0].lostBrand.Agency__c = depart1.Id;
		conTest2.LostReport.LostBrands[0].lostBrand.Lost_By_Company__c = '其他';
		conTest2.LostReport.LostBrands[0].lostBrand.Lost_By_Company_Mannual__c = 'dddddd';
		conTest2.setBrandNo = 0;
		conTest2.setbrandmannual();
		conTest2.LostReport.LostBrands[0].LostProducts[0].lineNo2 = 0;
		conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss = new PCLLostProduct__c(Quantity__c = 3);
		// conTest2.setBrand();
		conTest2.dataEntry();
	}

	//@isTest
	// private static void TestMeth3(){

	// 	// recode type を取得
	// 	List<RecordType> rectCo = [select Id from RecordType where IsActive = true and SobjectType = 'Account' and Name = '病院'];
	// 	if (rectCo.size() == 0) {
	// 		throw new ControllerUtil.myException('not found 病院 recodetype');
	// 	}
	// 	List<RecordType> rectDpt = [select Id, Name from RecordType where IsActive = true and SobjectType = 'Account' and Name IN ('診療科 消化科', '診療科 呼吸科') order by Name desc];
	// 	if (rectDpt.size() == 0) {
	// 		throw new ControllerUtil.myException('not found 診療科 recodetype');
	// 	}

	// 	// insert
	// 	Account company1 = new Account();
	// 	company1.RecordTypeId = rectCo[0].Id;
	// 	company1.Name = '病院テスト1';
	// 	insert company1;

	// 	List<Account> dc1s = [Select Id, Name, Department_Class_Label__c, Sys_Dept_Name_Change_Chk__c from Account where Parent.Id = : company1.Id order by Department_Class_Label__c];

	// 	Account depart1 = new Account();
	// 	depart1.RecordTypeId = rectDpt[0].Id;
	// 	depart1.Name = '*';
	// 	depart1.Department_Name__c  = '診療科1';
	// 	depart1.ParentId= dc1s[0].Id;
	// 	depart1.Department_Class__c = dc1s[0].Id;
	// 	depart1.Hospital__c= company1.Id;
	// 	insert depart1;

	// 	PCLLostReportController conTest2 = EditLoad();
	// 	Set<Id> IdSet=new Set<Id> {depart1.Id};
	// 	conTest2.deleteBrandIDSet=IdSet;
	// 	conTest2.LostReport.LostReport.LostType__c = '部分失单';
	// 	conTest2.LostReport.LostBrands[0].lostBrand.LostPrice__c = 12;
	// 	conTest2.LostReport.LostBrands[0].lostBrand.Lost_reason_main__c = '价格';
	// 	conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss.Quantity__c =0;
	// 	conTest2.LostReport.LostBrands[0].lostBrand.Agency__c = depart1.Id;
	// 	conTest2.LostReport.LostBrands[0].lostBrand.Lost_By_Company__c = 'STORZ';
	// 	conTest2.LostReport.LostBrands[0].LostProducts[0].lineNo2 = 0;
	// 	conTest2.LostReport.LostBrands[0].LostProducts[0].LostProductss = new PCLLostProduct__c(Quantity__c = 0);
	// 	// conTest2.setBrand();
	// 	conTest2.dataEntry();
	// }





	// add tcm 20211213 end
}