/***********************************************************************************************************
 * Name         : SubUploadEditHelperTest
 * Purpose      : Test class for SubUploadEditHelper
 **********************************************************************************************************/
@isTest
private class SubUploadEditHelperTest {
    @TestSetup
    static void makeData() {
        Artist__c artist = TestFactory.createArtist();
        Label__c label = TestFactory.createLabel();
        Territory__c territory = TestFactory.createTerritory();
        TL__c tl = TestFactory.createTerritoryLabel(territory.Id, true);
        tl.Label_ID__c = label.Id;
        update tl;
        Tla__c tla = TestFactory.createTerritoryLabelArtist(
            TestFactory.DEFAULT_TLA_NAME,
            true,
            tl.Id,
            territory.Id,
            label.Id,
            null
        );
        tla.Artist_ID__c = artist.Id;
        update tla;
        Mailing_List__c ml = TestFactory.createMailingList(TestFactory.DEFAULT_MAILING_LIST_NAME, tla.Id);
        ml.Active__c = true;
        update ml;
    }

    /************************************************************************************
     * Method: insertSubUpload
     * APEX method tested : SubUploadEditHelper.upsertSubUpload
     * Description : Verifies that a new subUpload is created when the Id argument is not
     *  provided
     *************************************************************************************/
    @IsTest
    static void insertSubUpload() {
        Mailing_List__c ml = [SELECT Id FROM Mailing_List__c LIMIT 1];
        Tla__c tla = [SELECT Id FROM Tla__c LIMIT 1];

        List<String> dsps = FormatUtils.getActivePicklistValues(
            Sub_Upload_Util__c.DSP__c.getdescribe().getPicklistValues()
        );
        String selectedDSP = dsps[0];

        Map<String, String> crmsMap = FormatUtils.getActivePicklistValuesMap(
            Sub_Upload_Util__c.Is_Crm_Generated__c.getdescribe().getPicklistValues()
        );
        List<String> crmKeys = new List<String>(crmsMap.keySet());
        String selectedCRM = crmKeys[0];

        Test.startTest();
        Id subUploadId = SubUploadEditHelper.upsertSubUpload(
            null,
            ml.Id,
            tla.Id,
            selectedDSP,
            selectedCRM,
            'Test FSD',
            'Test Name',
            false,
            TestFactory.getPicklistValues('Sub_Upload_Util__c', 'AcquisitionChannel__c')[0]
        );
        Test.stopTest();

        List<Sub_Upload_Util__c> subUploads = [
            SELECT Id, DSP__c, Mailing_List__c, File_Source_Description__c, Is_Crm_Generated__c, Name
            FROM Sub_Upload_Util__c
            WHERE Id = :subUploadId
        ];

        Assert.areEqual(1, subUploads.size());
        Assert.areEqual('Test Name', subUploads[0].Name);
        Assert.areEqual(selectedDSP, subUploads[0].DSP__c);
        Assert.areEqual(ml.Id, subUploads[0].Mailing_List__c);
        Assert.areEqual(selectedCRM, subUploads[0].Is_Crm_Generated__c);
        Assert.areEqual('Test FSD', subUploads[0].File_Source_Description__c);
    }

    /************************************************************************************
     * Method: updateSubUpload
     * APEX method tested : SubUploadEditHelper.upsertSubUpload
     * Description : Verifies that a subUpload is updated when the Id argument is provided
     *************************************************************************************/
    @IsTest
    static void updateSubUpload() {
        Id mlId = [SELECT Id FROM Mailing_List__c LIMIT 1].Id;
        Id tlaId = [SELECT Id FROM Tla__c LIMIT 1].Id;
        Id labelId = [SELECT Id FROM Label__c LIMIT 1].Id;
        Id artistId = [SELECT Id FROM Artist__c LIMIT 1].Id;
        Id territoryId = [SELECT Id FROM Territory__c LIMIT 1].Id;

        List<String> dsps = FormatUtils.getActivePicklistValues(
            Sub_Upload_Util__c.DSP__c.getdescribe().getPicklistValues()
        );

        Map<String, String> crmsMap = FormatUtils.getActivePicklistValuesMap(
            Sub_Upload_Util__c.Is_Crm_Generated__c.getdescribe().getPicklistValues()
        );
        List<String> crmKeys = new List<String>(crmsMap.keySet());

        Sub_Upload_Util__c subUpload = new Sub_Upload_Util__c();
        subUpload.Name = 'Test';
        subUpload.Mailing_List__c = mlId;
        subUpload.Territory__c = territoryId;
        subUpload.Artist__c = artistId;
        subUpload.Label__c = labelId;
        subUpload.File_Source_Description__c = 'Test';
        subUpload.DSP__c = dsps[0];
        subUpload.Is_Crm_Generated__c = crmKeys[0];
        insert subUpload;

        String selectedDSP = dsps[1];
        String selectedCRM = crmKeys[1];
        String selectedUploadSource = TestFactory.getPicklistValues('Sub_Upload_Util__c', 'AcquisitionChannel__c')[0];

        Test.startTest();
        Id result = SubUploadEditHelper.upsertSubUpload(
            subUpload.Id,
            mlId,
            tlaId,
            selectedDSP,
            selectedCRM,
            'Test FSD',
            'Test Name',
            false,
            selectedUploadSource
        );
        Test.stopTest();

        Assert.areEqual(subUpload.Id, result);

        List<Sub_Upload_Util__c> subUploads = [
            SELECT Id, DSP__c, Mailing_List__c, File_Source_Description__c, Is_Crm_Generated__c, Name
            FROM Sub_Upload_Util__c
        ];

        Assert.areEqual(1, subUploads.size());
        Assert.areEqual(result, subUploads[0].Id);
        Assert.areEqual(mlId, subUploads[0].Mailing_List__c);
        Assert.areEqual('Test Name', subUploads[0].Name);
        Assert.areEqual(selectedDSP, subUploads[0].DSP__c);
        Assert.areEqual(selectedCRM, subUploads[0].Is_Crm_Generated__c);
        Assert.areEqual('Test FSD', subUploads[0].File_Source_Description__c);
    }

    /************************************************************************************
     * Method: upsertSubUploadException
     * APEX method tested : SubUploadEditHelper.upsertSubUpload
     * Description : Verifies that an Apex_Error_Log__c is created when an error occurs
     *************************************************************************************/
    @IsTest
    static void upsertSubUploadException() {
        Test.startTest();
        try {
            SubUploadEditHelper.upsertSubUpload(null, null, null, null, null, null, null, null, null);
            Assert.fail();
        } catch (Exception ex) {
        }
        Test.stopTest();

        List<Apex_Error_Log__c> logs = [SELECT Id, Error_Class_Name__c, Error_Method_Name__c FROM Apex_Error_Log__c];
        Assert.areEqual(1, logs.size());
        Assert.areEqual('SubUploadEditHelper', logs[0].Error_Class_Name__c);
        Assert.areEqual('upsertSubUpload', logs[0].Error_Method_Name__c);
    }

    /************************************************************************************
     * Method: getData
     * APEX method tested : SubUploadEditHelper.getData
     * Description : Verifies that ML information is retrieved
     *************************************************************************************/
    @IsTest
    static void getData() {
        Id mlId = [SELECT Id FROM Mailing_List__c LIMIT 1].Id;
        Id tlaId = [SELECT Id FROM Tla__c LIMIT 1].Id;

        Test.startTest();
        List<SubUploadEditHelper.OptionWrapper> options = SubUploadEditHelper.getData();
        Test.stopTest();

        Assert.areEqual(1, options.size());
        Assert.areEqual(TestFactory.DEFAULT_ARTIST_NAME, options[0].artist);
        Assert.areEqual(TestFactory.DEFAULT_TERRITORY_NAME, options[0].territory);
        Assert.areEqual(TestFactory.DEFAULT_MAILING_LIST_NAME, options[0].mlName);
        Assert.areEqual(TestFactory.DEFAULT_LABEL_NAME, options[0].label);
        Assert.areEqual(mlId, options[0].mlId);
        Assert.areEqual(tlaId, options[0].tlaId);
    }
}