@isTest
private class FixtureRemindControllerTest {
   
    static User manager;
    static User east;
    static User north;
    static User south;
    static User other;
    static User admin;
    static ConsumTestDataFactory factory;
    static void setupMasterData(){

        Profile p_2B3 = [SELECT Id FROM Profile WHERE Name LIKE '%2B3%' Limit 1];
        Profile p_2B1 = [SELECT Id FROM Profile WHERE Name LIKE '%2B1%' Limit 1];

        UserRole r_east = [SELECT Id FROM UserRole WHERE Name = '备品中心华东管理成员' Limit 1];
        UserRole r_north = [SELECT Id FROM UserRole WHERE Name = '备品中心北方管理成员' Limit 1];
        UserRole r_south = [SELECT Id FROM UserRole WHERE Name = '备品中心南方管理成员' Limit 1];
        UserRole r_other = [SELECT Id FROM UserRole WHERE Name = '华东备品运营课' Limit 1];

        admin = new User(Test_staff__c = true);
        admin.LastName = '_サンブリッジ';
        admin.FirstName = 'う';
        admin.Alias = 'う';
        admin.Email = 'olympusTest03@sunbridge.com';
        admin.username = 'olympusTest03@sunbridge.com';
        admin.CommunityNickname = 'う';
        admin.IsActive = true;
        admin.EmailEncodingKey = 'ISO-2022-JP';
        admin.TimeZoneSidKey = 'Asia/Tokyo';
        admin.LocaleSidKey = 'ja_JP';
        admin.LanguageLocaleKey = 'ja';
        admin.ProfileId = System.Label.ProfileId_SystemAdmin;
        admin.Job_Category__c = '销售推广';
        admin.Province__c = '上海市';
        admin.Use_Start_Date__c = Date.today().addMonths(-6);
        admin.SalesManager__c = UserInfo.getUserId();
        admin.BuchangApprovalManagerSales__c = UserInfo.getUserId();
        admin.JingliApprovalManager__c = UserInfo.getUserId();
        admin.BuchangApprovalManager__c = UserInfo.getUserId();
        admin.ZongjianApprovalManager__c = UserInfo.getUserId();
        admin.Dept__c = '医疗华北营业本部';
        /// admin.profileid = p_2B3.Id;
        admin.userroleid = r_north.Id;
        insert admin;

        System.runAs (admin) {

            manager = new User(alias = 'manager', email='manager@acme.com',
                emailencodingkey='UTF-8', lastname='manager',
                languagelocalekey='en_US',
                localesidkey='ja_JP', profileid = p_2B3.Id, userroleid = r_east.Id,
                timezonesidkey='Asia/Shanghai',
                username='manager@acme.com' + Datetime.now().getTime());

            east = new User(alias = 'east', email='east@acme.com',
                emailencodingkey='UTF-8', lastname='east',
                languagelocalekey='en_US',
                localesidkey='ja_JP', profileid = p_2B1.Id, userroleid = r_east.Id,
                timezonesidkey='Asia/Shanghai',
                username='east@acme.com' + Datetime.now().getTime());

            south = new User(alias = 'south', email='south@acme.com',
                emailencodingkey='UTF-8', lastname='south',
                languagelocalekey='en_US',
                localesidkey='ja_JP', profileid = p_2B1.Id, userroleid = r_south.Id,
                timezonesidkey='Asia/Shanghai',
                username='south@acme.com' + Datetime.now().getTime());

            north = new User(alias = 'north', email='north@acme.com',
                emailencodingkey='UTF-8', lastname='north',
                languagelocalekey='en_US',
                localesidkey='ja_JP', profileid = p_2B1.Id, userroleid = r_north.Id,
                timezonesidkey='Asia/Shanghai',
                username='north@acme.com' + Datetime.now().getTime());

            other = new User(alias = 'other', email='other@acme.com',
                emailencodingkey='UTF-8', lastname='other',
                languagelocalekey='en_US',
                localesidkey='ja_JP', profileid = p_2B1.Id, userroleid = r_other.Id,
                timezonesidkey='Asia/Shanghai',
                username='other@acme.com' + Datetime.now().getTime());

            insert new User[] {manager, east, south, north, other};
            factory = new ConsumTestDataFactory();
            factory.eachStepUpdate = false;
            factory.setupTestData();
        }

    }
    static void setupConsumData(){
        factory.selectDetails();
        factory.approve();
        factory.defaultAssign();
        factory.shippmentRequest();
        factory.shipment();
        factory.updateData();
    }
    static void setupRentalData() {

        // 省
        Address_Level__c al = [SELECT Id FROM Address_Level__c LIMIT 1];

        // 市
        Address_Level2__c al2 = [SELECT Id FROM Address_Level2__c LIMIT 1];

        // 病院を作る
        Account hospital = [SELECT Id FROM Account WHERE Name = 'test hospital'];

        // 戦略科室を得る
        Account[] strategicDep = [SELECT Id FROM Account WHERE ParentId = :hospital.Id];

        // 診療科を作る
        Account dep = [SELECT Id FROM Account WHERE ParentId = :strategicDep[0].Id];

        Contact contact2 = [SELECT Id FROM Contact LIMIT 1];

        // 产品
        Product2 pro1 = new Product2(Name='name01',IsActive=true,Family='GI',
                Fixture_Model_No__c='n01',Serial_Lot_No__c='S/N tracing',
                Fixture_Model_No_T__c = 'n01', Asset_Model_No__c = 'Pro1',
                ProductCode_Ext__c='pc01',Manual_Entry__c=false);
        Product2 pro2 = new Product2(Name='name02',IsActive=true,Family='GI',
                Fixture_Model_No__c='n02',Serial_Lot_No__c='Lot tracing',
                Fixture_Model_No_T__c = 'n02', Asset_Model_No__c = 'Pro2',
                ProductCode_Ext__c='pc02',Manual_Entry__c=false);
        Product2 pro3 = new Product2(Name='name03',IsActive=true,Family='GI',
                Fixture_Model_No__c='n03',Serial_Lot_No__c='Lot tracing',
                Fixture_Model_No_T__c = 'n03', Asset_Model_No__c = 'Pro3',
                ProductCode_Ext__c='pc03',Manual_Entry__c=false);
        insert new Product2[] {pro1, pro2, pro3};

        //备品借出申请
        Rental_Apply__c raObj = new Rental_Apply__c();
        raObj.Name = 'testra';
        raObj.Product_category__c = 'GI';
        raObj.Demo_purpose1__c = '产品试用';
        raObj.demo_purpose2__c = FixtureUtil.raDemo_purpose2MAP.get('shiyongwuxunjia');
        raObj.direct_send__c = '医疗机构';
        raObj.Loaner_received_staff__c = '王五';
        raObj.Loaner_received_staff_phone__c = '110';
        raObj.direct_shippment_address__c = '北京市';
        raObj.Hospital__c = hospital.Id;
        raObj.Strategic_dept__c = strategicDep[0].Id;
        raObj.Account__c = dep.Id;
        raObj.Request_shipping_day__c = Date.toDay();
        raObj.Hope_Lonaer_date_Num__c = 1;
        raObj.Request_return_day__c = Date.toDay();
        raObj.Status__c = '草案中';
        raObj.Phone_number__c = '1234567890';
        raObj.Loaner_medical_Staff__c = contact2.Id;
        //raObj.Person_In_Charge__c = manager.Id;
        raObj.Loaner_centre_mail_address__c = 'ocm_asset@olympus.com.cn';
        insert raObj;

        // 保有设备
        Asset asset1 = new Asset(Asset_Owner__c = 'Olympus');
        asset1.RecordTypeId = System.Label.Asset_RecordType;
        asset1.SerialNumber = 'asset1';
        asset1.Name = 'asset1';
        asset1.AccountId = dep.Id;
        asset1.Department_Class__c = strategicDep[0].Id;
        asset1.Hospital__c = hospital.Id;
        asset1.Product2Id = pro1.Id;
        asset1.Quantity = 1;
        asset1.Status = '不明';
        asset1.Manage_type__c = '个体管理';
        asset1.Loaner_accsessary__c = false;
        asset1.Out_of_wh__c = 0;
        asset1.Salesdepartment__c = '1.华北营业本部';
        asset1.Internal_asset_location__c = '北京 备品中心';
        asset1.Product_category__c = 'GI';
        asset1.Equipment_Type__c = '产品试用';
        asset1.SalesProvince__c = '北京';
        asset1.CompanyOfEquipment__c = '北京';
        asset1.Internal_Asset_number__c = '0001';
        asset1.EquipmentSet_Managment_Code__c = 'テスト１';

        Asset asset2 = new Asset(Asset_Owner__c = 'Olympus');
        asset2.RecordTypeId = System.Label.Asset_RecordType;
        asset2.SerialNumber = 'asset2';
        asset2.Name = 'asset2';
        asset2.AccountId = dep.Id;
        asset2.Department_Class__c = strategicDep[0].Id;
        asset2.Hospital__c = hospital.Id;
        asset2.Product2Id = pro2.Id;
        asset2.Quantity = 1;
        asset2.Status = '不明';
        asset2.Manage_type__c = '个体管理';
        asset2.Loaner_accsessary__c = true;
        asset2.Out_of_wh__c = 0;
        asset2.Salesdepartment__c = '1.华北营业本部';
        asset2.Internal_asset_location__c = '北京 备品中心';
        asset2.Product_category__c = 'GI';
        asset2.Equipment_Type__c = '产品试用';
        asset2.SalesProvince__c = '北京';
        asset2.CompanyOfEquipment__c = '北京';
        asset2.Internal_Asset_number__c = '0002';
        asset2.EquipmentSet_Managment_Code__c = 'テスト２';

        Asset asset3 = new Asset(Asset_Owner__c = 'Olympus');
        asset3.RecordTypeId = System.Label.Asset_RecordType;
        asset3.SerialNumber = 'asset3';
        asset3.Name = 'asset3';
        asset3.AccountId = dep.Id;
        asset3.Department_Class__c = strategicDep[0].Id;
        asset3.Hospital__c = hospital.Id;
        asset3.Product2Id = pro3.Id;
        asset3.Quantity = 50;
        asset3.Status = '不明';
        asset3.Manage_type__c = '数量管理';
        asset3.Loaner_accsessary__c = true;
        asset3.Out_of_wh__c = 0;
        asset3.Salesdepartment__c = '1.华北营业本部';
        asset3.Internal_asset_location__c = '北京 备品中心';
        asset3.Product_category__c = 'GI';
        asset3.Equipment_Type__c = '产品试用';
        asset3.SalesProvince__c = '北京';
        asset3.CompanyOfEquipment__c = '北京';
        asset3.Internal_Asset_number__c = '0003';
        asset3.EquipmentSet_Managment_Code__c = 'テスト３';
        insert new Asset[] {asset1, asset2, asset3};

        // 备品配套
        Fixture_Set__c fsObj1 = new Fixture_Set__c();
        fsObj1.Name = 'set1';
        fsObj1.Fixture_Set_Body_Model_No__c = 'modelNo1';
        fsObj1.Loaner_name__c = 'name1';
        insert fsObj1;

        // 备品配套明细
        Fixture_Set_Detail__c fsdObjA1 = new Fixture_Set_Detail__c();
        fsdObjA1.Name = '备品配套明细名1';
        fsdObjA1.Name_CHN_Created__c = '中文名称1';
        fsdObjA1.Product2__c = pro1.Id;
        fsdObjA1.Fixture_Set__c = fsObj1.Id;
        fsdObjA1.Is_Body__c = true;
        fsdObjA1.Is_Optional__c = false;
        fsdObjA1.UniqueKey__c = fsObj1.Id + ':' + pro1.Id;
        fsdObjA1.SortInt__c = 1;

        Fixture_Set_Detail__c fsdObjA2 = new Fixture_Set_Detail__c();
        fsdObjA2.Name = '备品配套明细名2';
        fsdObjA2.Name_CHN_Created__c = '中文名称2';
        fsdObjA2.Product2__c = pro2.Id;
        fsdObjA2.Fixture_Set__c = fsObj1.Id;
        fsdObjA2.Is_Body__c = false;
        fsdObjA2.Is_Optional__c = true;
        fsdObjA2.UniqueKey__c = fsObj1.Id + ':' + pro2.Id;
        fsdObjA2.SortInt__c = 2;

        Fixture_Set_Detail__c fsdObjA3 = new Fixture_Set_Detail__c();
        fsdObjA3.Name = '备品配套明细名3';
        fsdObjA3.Name_CHN_Created__c = '中文名称3';
        fsdObjA3.Product2__c = pro3.Id;
        fsdObjA3.Fixture_Set__c = fsObj1.Id;
        fsdObjA3.Is_Body__c = false;
        fsdObjA3.Is_Optional__c = true;
        fsdObjA3.UniqueKey__c = fsObj1.Id + ':' + pro3.Id;
        fsdObjA3.SortInt__c = 3;
        insert new Fixture_Set_Detail__c[] {fsdObjA1,fsdObjA2,fsdObjA3};

        // 借出备品配套一览
        Rental_Apply_Equipment_Set__c raesObj = new Rental_Apply_Equipment_Set__c();
        raesObj.Rental_Apply__c = raObj.Id;
        raesObj.Fixture_Set__c = fsObj1.Id;
        raesObj.Cancel_Select__c = false;
        raesObj.Rental_Start_Date__c = Date.toDay();
        raesObj.Rental_End_Date__c = Date.toDay();
        raesObj.IndexFromUniqueKey__c = 1;
        raesObj.UniqueKey__c = '1:'+ fsObj1.Id + ':1';
        insert raesObj;

        // 借出备品配套一览明细
        Rental_Apply_Equipment_Set_Detail__c raesdObj1 = new Rental_Apply_Equipment_Set_Detail__c();
        raesdObj1.Rental_Apply__c = raObj.Id;
        raesdObj1.Fixture_Set_Detail__c = fsdObjA1.Id;
        raesdObj1.Rental_Num__c = 1;
        raesdObj1.Queue_Number__c = null;
        raesdObj1.Is_Body__c = true;
        raesdObj1.Rental_Apply_Equipment_Set__c = raesObj.Id;
        raesdObj1.IndexFromUniqueKey__c = 1;
        raesdObj1.UniqueKey__c = '1:'+ raesObj.Id + ':' + fsdObjA1.Id + ':1';
        raesdObj1.FSD_OneToOneAccessory_Cnt__c = 0;
        raesdObj1.FSD_Is_Optional__c = false;
        raesdObj1.FSD_Is_OneToOne__c = false;
        raesdObj1.ApplyPersonAppended__c = false;
        raesdObj1.FSD_Fixture_Model_No__c = 'n01';
        raesdObj1.Fixture_Model_No_text__c = 'n01';
        raesdObj1.RAESD_Status_Text__c = '待分配';

        Rental_Apply_Equipment_Set_Detail__c raesdObj2 = new Rental_Apply_Equipment_Set_Detail__c();
        raesdObj2.Rental_Apply__c = raObj.Id;
        raesdObj2.Fixture_Set_Detail__c = fsdObjA2.Id;
        raesdObj2.Rental_Num__c = 1;
        raesdObj2.Queue_Number__c = null;
        raesdObj2.Is_Body__c = false;
        raesdObj2.Rental_Apply_Equipment_Set__c = raesObj.Id;
        raesdObj2.IndexFromUniqueKey__c = 2;
        raesdObj2.UniqueKey__c = '1:'+ raesObj.Id + ':' + fsdObjA2.Id + ':2';
        raesdObj2.FSD_OneToOneAccessory_Cnt__c = 0;
        raesdObj2.FSD_Is_Optional__c = false;
        raesdObj2.FSD_Is_OneToOne__c = false;
        raesdObj2.ApplyPersonAppended__c = false;
        raesdObj2.FSD_Fixture_Model_No__c = 'n02';
        raesdObj2.Fixture_Model_No_text__c = 'n02';
        raesdObj2.RAESD_Status_Text__c = '待分配';

        Rental_Apply_Equipment_Set_Detail__c raesdObj3 = new Rental_Apply_Equipment_Set_Detail__c();
        raesdObj3.Rental_Apply__c = raObj.Id;
        raesdObj3.Fixture_Set_Detail__c = fsdObjA3.Id;
        raesdObj3.Rental_Num__c = 1;
        raesdObj3.Queue_Number__c = null;
        raesdObj3.Is_Body__c = false;
        raesdObj3.Rental_Apply_Equipment_Set__c = raesObj.Id;
        raesdObj3.IndexFromUniqueKey__c = 3;
        raesdObj3.UniqueKey__c = '1:'+ raesObj.Id + ':' + fsdObjA3.Id + ':3';
        raesdObj3.FSD_OneToOneAccessory_Cnt__c = 2;
        raesdObj3.FSD_Is_Optional__c = false;
        raesdObj3.FSD_Is_OneToOne__c = false;
        raesdObj3.ApplyPersonAppended__c = false;
        raesdObj3.FSD_Fixture_Model_No__c = 'n03';
        raesdObj3.Fixture_Model_No_text__c = 'n03';
        raesdObj3.RAESD_Status_Text__c = '待分配';
        insert new Rental_Apply_Equipment_Set_Detail__c[] {raesdObj1,raesdObj2,raesdObj3};

        // 申请单变为已批准
        raObj.Status__c = '已批准';
        raObj.Loaner_centre_mail_address__c = 'ocm_asset@olympus.com.cn';

        update raObj;
    }

    static testMethod void testNorthAdmin() {
        setupMasterData();
        System.runAs(admin){
            setupRentalData();
            List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [SELECT RAESD_Status__c,Rental_Apply__r.Loaner_centre_mail_address__c from Rental_Apply_Equipment_Set_Detail__c];
            for(Rental_Apply_Equipment_Set_Detail__c raesd:raesdList){
                raesd.RAESD_Status_Text__c = '待分配';
            }
            update raesdList;
            Test.startTest();
            FixtureRemindController controller = new FixtureRemindController();
            controller.init();
            Test.stopTest();
            System.assertEquals(false, controller.hasEastMap);
            System.assertEquals(false, controller.hasEastConsumMap);
            System.assertEquals(false, controller.hasSouthMap);
            System.assertEquals(true, controller.hasNorthMap);
            //System.assertEquals(1, controller.northMap.get('待分配件数'));
            System.assertEquals(false, controller.hasTotalMap);
        }
    }

    static testMethod void testManager() {
        setupMasterData();
        System.runAs(admin){
            setupConsumData();
            List<Consum_Apply_Equipment_Set_Detail__c> caesdList = [SELECT Id FROM Consum_Apply_Equipment_Set_Detail__c];
            for(Consum_Apply_Equipment_Set_Detail__c caesd:caesdList){
                caesd.Received_Confirm__c = 'NG';
                caesd.Received_NG_Content__c = 'NG';
                caesd.Picture1__c = '1';
            }
            update caesdList;
            Test.startTest();
            FixtureRemindController controller = new FixtureRemindController();
            controller.init();
            Test.stopTest();
            //System.assertEquals(true, controller.hasEastMap);
            //System.assertEquals(true, controller.hasEastConsumMap);
           // System.assertEquals(1, controller.eastConsumMap.get('到货NG待确认数量'));
            //System.assertEquals(true, controller.hasSouthMap);
           // System.assertEquals(true, controller.hasNorthMap);
           // System.assertEquals(true, controller.hasTotalMap);
        }
    }
    static testMethod void testEast() {
        setupMasterData();
        System.runAs(admin){
            setupConsumData();
            // 明细调到已回寄
            FixtureDeliverySlip__c slip = new FixtureDeliverySlip__c();
            slip.DeliveryType__c = '回寄';
            slip.DeliveryCompany__c = 'Fedex';
            slip.Distributor_method__c = '陆运';
            slip.Wh_Staff__c = east.Id;
            slip.Shippment_loaner_time__c = System.now();

            insert slip;
            List<Consum_Apply_Equipment_Set_Detail__c> caesdList = [SELECT Id FROM Consum_Apply_Equipment_Set_Detail__c];
            for(Consum_Apply_Equipment_Set_Detail__c caesd:caesdList){
                caesd.Received_Confirm__c = 'OK';
                caesd.Return_DeliverySlip__c = slip.Id;
                caesd.Asset_return_time__c = System.now();
            }
            update caesdList;
            Consum_Apply__c ca = [SELECT Id FROM Consum_Apply__c];
            ca.HP_received_sign_rich__c = '1';
            ca.AssetManageConfirm__c = true;
            update ca;

            Test.startTest();
            FixtureRemindController controller = new FixtureRemindController();
            controller.init();
            Test.stopTest();
            //System.assertEquals(true, controller.hasEastMap);
           // System.assertEquals(true, controller.hasEastConsumMap);
            //System.assertEquals(1, controller.eastConsumMap.get('待收货件数'));
            //System.assertEquals(false, controller.hasSouthMap);
           // System.assertEquals(false, controller.hasNorthMap);
           // System.assertEquals(false, controller.hasTotalMap);
        }
    }
    static testMethod void testSouth() {
        setupMasterData();
        System.runAs(south){
            Test.startTest();
            FixtureRemindController controller = new FixtureRemindController();
            controller.init();
            Test.stopTest();
            System.assertEquals(false, controller.hasEastMap);
            System.assertEquals(false, controller.hasEastConsumMap);
            System.assertEquals(true, controller.hasSouthMap);
            System.assertEquals(false, controller.hasNorthMap);
            System.assertEquals(false, controller.hasTotalMap);
        }
    }
    static testMethod void testNorth() {
        setupMasterData();
        System.runAs(north){
            Test.startTest();
            FixtureRemindController controller = new FixtureRemindController();
            controller.init();
            Test.stopTest();
            System.assertEquals(false, controller.hasEastMap);
            System.assertEquals(false, controller.hasEastConsumMap);
            System.assertEquals(false, controller.hasSouthMap);
            System.assertEquals(true, controller.hasNorthMap);
            System.assertEquals(false, controller.hasTotalMap);
        }
    }
    static testMethod void testOther() {
        setupMasterData();
        System.runAs(other){
            Test.startTest();
            FixtureRemindController controller = new FixtureRemindController();
            controller.init();
            Test.stopTest();
            System.assertEquals(false, controller.hasEastMap);
            System.assertEquals(false, controller.hasEastConsumMap);
            System.assertEquals(false, controller.hasSouthMap);
            System.assertEquals(false, controller.hasNorthMap);
            System.assertEquals(false, controller.hasTotalMap);
        }
    }
    static testMethod void testManagerTime() {

        //OlympusCalendar__c oc = new OlympusCalendar__c(Date__c=System.today(), Before_1_WorkDay__c=System.today().addDays(-1));
        //insert oc;
        //FixtureRemindSnapshotBatch b = new FixtureRemindSnapshotBatch();
        //Database.executeBatch(b);
        //List<FixtureRemindSnapshot__c> frsList = [SELECT Id,Date__c,Time__c FROM FixtureRemindSnapshot__c];

        setupMasterData();
        System.runAs(manager){
            FixtureRemindSnapshot__c frs1 = new FixtureRemindSnapshot__c(Dai_Fen_Pei_Cnt__c = 1
                                                                        , Region__c = '北方'
                                                                        , Time__c ='14:00'
                                                                        , Date__c = System.today()
                                                                        );
            FixtureRemindSnapshot__c frs2 = new FixtureRemindSnapshot__c(Dai_Fen_Pei_Cnt__c = 1
                                                                        , Region__c ='南方'
                                                                        , Time__c = '14:00'
                                                                        , Date__c = System.today()
                                                                        );
            FixtureRemindSnapshot__c frs3 = new FixtureRemindSnapshot__c(Dai_Fen_Pei_Cnt__c = 1
                                                                        , Consum_Dai_Fen_Pei_Cnt__c = 2
                                                                        , Region__c = '华东'
                                                                        , Time__c = '14:00'
                                                                        , Date__c = System.today()
                                                                        );
            insert new List<FixtureRemindSnapshot__c> {frs1, frs2, frs3};
            Test.startTest();
            FixtureRemindController controller = new FixtureRemindController();
            controller.init();
            controller.snap.Date__c = System.today();
            controller.snap.Time__c = '14:00';
            controller.refreshTable();
            Test.stopTest();
            System.assertEquals(1, controller.eastMap.get('待分配件数'));
            System.assertEquals(2, controller.eastConsumMap.get('待分配件数'));
            System.assertEquals(1, controller.southMap.get('待分配件数'));
            System.assertEquals(1, controller.northMap.get('待分配件数'));
            System.assertEquals(3, controller.totalMap.get('待分配件数'));
        }
    }
}