@isTest
public class AgencyShareUpdateBatchTest {

    public static Account account1;
    public static Account account2;
    public static Contact contact1;
    public static Contact contact2;
    public static Contact contact3;
    public static User user;
    public static User user2;
    public static Agency_Hospital_Link__c agency_hospital_link;
    public static Agency_Opportunity__c agency_opportunity;
    public static Agency_Opportunity__c agency_opportunity2;
    
    // Normal Data
    public static void setupData() {
        // 取引先
        account1 = new Account();
        account1.Name = 'test1医院';
        account1.RecordTypeId = '01210000000QemG';
        account2 = new Account();
        account2.Name = 'test1经销商';
        account2.RecordTypeId = '01210000000Qem1';
        Id AgencyRecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('Agency').getRecordTypeId();

        insert new List<Account> {account1, account2};

        // 取引先責任者
        contact1 = new Contact();
        contact1.AccountId = account1.Id;
        contact1.FirstName = '責任者';
        contact1.LastName = 'test1医院';
        contact2 = new Contact();
        contact2.AccountId = account2.Id;
        contact2.FirstName = '責任者';
        contact2.LastName = 'test1经销商';
        contact3 = new Contact();
        contact3.AccountId = account2.Id;
        contact3.FirstName = '責任者';
        contact3.LastName = 'test2经销商';
        insert new List<contact> {contact1,contact2,contact3};

        // ユーザー
        Profile p = [select Id from Profile where Name = '901_经销商活动系统'];
        user = new User();
        user.ProfileId = p.Id;
        user.ContactId = contact2.Id;
        user.FirstName = 'ユーザー';
        user.LastName = 'テスト';
        user.Email = 'test_user@example.com';
        user.emailencodingkey='UTF-8';
        user.languagelocalekey='zh_CN';
        user.localesidkey='ja_JP';
        user.timezonesidkey='Asia/Shanghai';
        user.Username = 'test_user@example.com' + System.now().millisecond();
        user.Alias = 'テユ';
        user.CommunityNickname = 'tu1' + System.now().millisecond();

        user2 = new User();
        user2.ProfileId = p.Id;
        user2.ContactId = contact3.Id;
        user2.FirstName = 'ユーザー2';
        user2.LastName = 'テスト2';
        user2.Email = 'test_user2@example.com';
        user2.emailencodingkey='UTF-8';
        user2.languagelocalekey='zh_CN';
        user2.localesidkey='ja_JP';
        user2.timezonesidkey='Asia/Shanghai';
        user2.Username = 'test_user2@example.com' + System.now().millisecond();
        user2.Alias = 'テユ2';
        user2.CommunityNickname = 'tu2' + System.now().millisecond();

        insert new List<User> {user, user2};

        agency_hospital_link = new Agency_Hospital_Link__c();
        agency_hospital_link.Name = 'test1代理店医院';
        agency_hospital_link.Hospital__c = account1.Id;
        agency_hospital_link.Agency__c = account2.Id;
        agency_hospital_link.OwnerId = user.Id;
        agency_hospital_link.Agency_Campaign_Obj__c = true;
        insert agency_hospital_link;

        ProductTypes__c productTypes = new ProductTypes__c();
        productTypes.Name ='290系统';
        productTypes.Name2__c ='290系统';
        productTypes.Department_Cateogy__c = 'GI;BF;GS';
        insert  productTypes;

        Id rtId = [select Id,DeveloperName from RecordType where IsActive = true and SobjectType = 'Agency_Opportunity__c' and DeveloperName = 'Opportunity'].Id;
        // Schema.SobjectType.Agency_Opportunity__c.getRecordTypeInfosByName().get('询价').getRecordTypeId();

        agency_opportunity = new Agency_Opportunity__c();
        agency_opportunity.RecordTypeId = rtId;
        agency_opportunity.Name = '引合1';
        agency_opportunity.Hospital_Target__c = account1.Id;
        agency_opportunity.Agency__c = account2.Id;
        agency_opportunity.Agency_Hospital__c = agency_hospital_link.Id;
        agency_opportunity.StageName__c = '还没申请预算';
        agency_opportunity.OwnerId = user.Id;
        agency_opportunity.NewOpportunity_Agency_Apply_Status__c = '批准';
        agency_opportunity.OCM_Change_To_Opportunity_Flg__c = true;
        agency_opportunity.Department_Cateogy__c = 'GI';
        agency_opportunity.Product_Category1_P__c ='290系统';
        insert agency_opportunity;

        Opportunity opp = new Opportunity();
        opp.Agency_Opportunity__c = agency_opportunity.Id;
        opp.Name = 'test询价';
        opp.StageName = '目標';
        //opp.AgencyOpp_FromOCM__c = true;
        opp.SAP_Send_OK__c = false;
        opp.CloseDate = Date.newInstance(2222, 7, 15);
        insert opp;
        opp.SAP_Send_OK__c = true;

        agency_opportunity2 = new Agency_Opportunity__c();
        agency_opportunity2.RecordTypeId = rtId;
        agency_opportunity2.Name = '引合2';
        agency_opportunity2.Hospital_Target__c = account1.Id;
        agency_opportunity2.Agency__c = account2.Id;
        agency_opportunity2.Agency_Hospital__c = agency_hospital_link.Id;
        //oObj.OCSM_Owner__c != nObj.OCSM_Owner__c
        agency_opportunity2.OwnerId = user2.Id;
        agency_opportunity2.Department_Cateogy__c = 'GI';
        agency_opportunity2.NewOpportunity_Agency_Apply_Status__c = '批准';
        agency_opportunity2.OCM_Change_To_Opportunity_Flg__c = false;
        insert agency_opportunity2;
    }

    @isTest
    public static void shareToOSCM_Test() {
        setupData();
        String rowCause = Schema.Agency_Opportunity__Share.RowCause.OCSM_Owner_c_User__c;
        List<Agency_Opportunity__Share> agencyopportunityShare=[SELECT
                    RowCause,ParentId,UserOrGroupId
                FROM Agency_Opportunity__Share
                WHERE ParentId=:agency_opportunity.Id
                  AND RowCause = :rowCause];

        System.assertEquals('OCSM_Owner_c_User__c', agencyopportunityShare[0].RowCause);
        System.assertEquals(UserInfo.getUserId(), agencyopportunityShare[0].UserOrGroupId);

        // テストの開始
        Test.startTest();
        List<RecordType> deptRId = [select Id, DeveloperName from RecordType where IsActive = true and SobjectType = 'Account' and DeveloperName = 'Department_Class_GI'];
        List<Account> GIDept = [select id, OwnerId from Account where Hospital_Department_Class__c = :account1.Id and RecordTypeId = :deptRId[0].Id];
        System.assertEquals(1, GIDept.size());

        Profile p2 = [select Id from Profile where Name = '系统管理员'];
        User user3 = new User();
        user3.ProfileId = p2.Id;
        user3.FirstName = 'ユーザー3';
        user3.LastName = 'テスト';
        user3.Email = 'test_user3@example.com';
        user3.emailencodingkey='UTF-8';
        user3.languagelocalekey='zh_CN';
        user3.localesidkey='ja_JP';
        user3.timezonesidkey='Asia/Shanghai';
        user3.Username = 'test_user3@example.com' + System.now().millisecond();
        user3.Alias = 'テユ';
        user3.CommunityNickname = 'tu1' + System.now().millisecond();
        insert user3;

        GIDept[0].OwnerId = user3.Id;
        update GIDept;

        AgencyShareUpdateBatch mBatch = new AgencyShareUpdateBatch();
        Database.executeBatch(mBatch);

        Test.stopTest();

        agencyopportunityShare=[SELECT
                    RowCause,ParentId,UserOrGroupId
                FROM Agency_Opportunity__Share
                WHERE ParentId=:agency_opportunity2.Id
                  AND RowCause = :rowCause];

        System.assertEquals('OCSM_Owner_c_User__c', agencyopportunityShare[0].RowCause);
        System.assertEquals(user3.Id, agencyopportunityShare[0].UserOrGroupId);
    }
}