﻿(function () {
    "use strict";

    var app = angular.module("AIC");

    //This service returns metadata for the application (i.e. field labels, dropdown options, etc.)
    function MetadataService($resource, $rootScope, PARTICIPANT_ROLES, PARTICIPANT_DEVICE_TYPES, DEVICE_SERVICE_STATUSES, DEVICE_STATUSES,
        INSPECTOR_DEVICE_TYPES, INSPECTOR_POWER_TYPES, INSPECTOR_OPERATION_TYPES, AIC_INSPECTION_TYPES, BULK_ACTIONS,
        AIC_INSPECTION_RESULT, INSPECTOR_CODE_REFERENCES, LEGAL_AGREEMENT_WORDING, YES_NO_OPTIONS, FIRESERVICE_PHASE2_OPTIONS) {

        //Private function to handle locating the correct code definition.
        var getCodeDefinitionByKey = function (codeDefinitionKey) {

            var codeDef = [{ code: '', description: '' }];
            
            //TODO:  Make this less hillbilly. It should just retrieve this information from the server.  
            switch (codeDefinitionKey) {
                case "Hansen.Property.ContactCapacityCode":
                    codeDef = angular.copy(PARTICIPANT_ROLES);
                    break;
                    
                case 'Hansen.AssetManagement.Plant.PlantEquipmentServiceStatus':
                    codeDef = angular.copy(DEVICE_SERVICE_STATUSES);
                    break;

                case 'Hansen.CDR.Use.InspectionResult':
                    codeDef = angular.copy(AIC_INSPECTION_RESULT);
                    break;

                case "DOB_AIC.OwnerDeviceTypeC":
                    codeDef = angular.copy(PARTICIPANT_DEVICE_TYPES);
                    break;

                case 'Hansen.CDR.Use.StatusCode':
                    codeDef = angular.copy(DEVICE_STATUSES);
                    break;
                    
                case 'DOB_AIC.InspDeviceTypeC':
                    codeDef = angular.copy(INSPECTOR_DEVICE_TYPES);
                    break;

                case 'DOB_AIC.PowerTypeC':
                    codeDef = angular.copy(INSPECTOR_POWER_TYPES);
                    break;

                case 'DOB_AIC.OperationTypeC':
                    codeDef = angular.copy(INSPECTOR_OPERATION_TYPES);
                    break;

                case 'DOB_AIC.InspectionTypeC':
                    codeDef = angular.copy(AIC_INSPECTION_TYPES);
                    break;
                    
                case 'DOB_AIC.BulkActionTypes':
                    codeDef = angular.copy(BULK_ACTIONS);
                    break;
                    
                case 'DOB_AIC.ElevCodeC':
                    codeDef = angular.copy(INSPECTOR_CODE_REFERENCES);
                    break;
                    
                case 'CoC_Use.SubmissionFormNameC':
                    codeDef = angular.copy(LEGAL_AGREEMENT_WORDING);
                    break;
                    
                case 'DOB_AIC.YesNoC':
                    codeDef = angular.copy(YES_NO_OPTIONS);
                    break;

                case 'DOB_AIC.FireServicePhase2C':
                    codeDef = angular.copy(FIRESERVICE_PHASE2_OPTIONS);
                    break;
                case null:
                    break;
                default:
                    //Didn't use the $console service because we really don't need to test this.  It's only here to make debugging easier during build.  
                    console.log("Could not find code definition for key: " + codeDefinitionKey);
                    break;
            }

            return codeDef;
        };

        //This method should be called once from app.run
        var publicRetrieveDynamicFormConfiguration = function() {
            
            if (angular.isNullOrUndefined($rootScope.dynamicFormConfiguration)) {
                var service = $resource('/Aic/H8CustomValidation/DynamicFormConfiguration.json');

                var successCallback = function(response) {
                    $rootScope.dynamicFormConfiguration = response;
                };

                var failureCallback = function() {

                };

                var promise = service.get().$promise;
                promise.then(successCallback, failureCallback);
            }
        };

        
        var publicGetDynamicFormConfigurationByDeviceType = function (deviceType) {
            for (var i = 0; i < $rootScope.dynamicFormConfiguration.configuredDeviceTypes.length; i++) {
                if ($rootScope.dynamicFormConfiguration.configuredDeviceTypes[i].deviceType === deviceType) {
                    return angular.copy($rootScope.dynamicFormConfiguration.configuredDeviceTypes[i]);
                }
            }
            return null; 
            
        };

        //TODO:  find a proper home for this logic.  It may be here, but it may be it's own service.  
        var publicGetConfigurationForControl = function (deviceType, controlId, detailsLocked) {
            var configuration = { renderType: 'HIDDEN'};

            var currentConfiguration = publicGetDynamicFormConfigurationByDeviceType(deviceType);
            
            if (!angular.isNullOrUndefined(currentConfiguration)) {
                for (var i = 0; i < currentConfiguration.fields.length; i++) {
                    if (currentConfiguration.fields[i].controlId === controlId) {
                        configuration = currentConfiguration.fields[i].configuration;
                        
                        //TODO:  Put some sort of rules engine in place for the DetailsLocked piece
                        if (detailsLocked === true && 
                            ( 
                             controlId !== 'Category1TestDate' &&
                             controlId !== 'Category5TestDate' &&
                             controlId !== 'FireServicePhase2Status'
                            )) {
                            if (configuration.renderType !== 'HIDDEN') {
                                configuration.renderType = 'READONLY';
                            }
                        }

                        break;
                    }
                }
            }

            return configuration;
        };


        var publicGetCodeDefinition = function(codeDefinitionKey) {
            return (getCodeDefinitionByKey(codeDefinitionKey));
        };

        var publicGetCodeDefinitionItemByCode = function(codeDefinitionKey, code) {
            var item = null;

            //Grab the code def in question
            var codeDef = getCodeDefinitionByKey(codeDefinitionKey);
            var i = 0;

            //Loop through all the items in the code def until we find what were looking for
            for (i = 0; i < codeDef.length; i++) {
                if (codeDef[i].code === code) {
                    item = codeDef[i];
                    break;
                }
            }

            //Log for easier debugging
            if (code !== null && item === null) {
                console.log("Could not find label for codeDefinitionKey: " + codeDefinitionKey + " with code: " + code);
            }

            return item;
        };


        return {
            getConfigurationForControl: publicGetConfigurationForControl,
            getDynamicFormConfigurationByDeviceType: publicGetDynamicFormConfigurationByDeviceType,
            retrieveDynamicFormConfiguration: publicRetrieveDynamicFormConfiguration,
            getCodeDefinition: publicGetCodeDefinition,
            getCodeDefinitionItemByCode: publicGetCodeDefinitionItemByCode,
        };
    }

    app.service("metadataService", ["$resource", "$rootScope", "PARTICIPANT_ROLES", 'PARTICIPANT_DEVICE_TYPES', 'DEVICE_SERVICE_STATUSES', 'DEVICE_STATUSES',
        'INSPECTOR_DEVICE_TYPES', 'INSPECTOR_POWER_TYPES', 'INSPECTOR_OPERATION_TYPES', 'AIC_INSPECTION_TYPES', 'BULK_ACTIONS', 'AIC_INSPECTION_RESULT',
        'INSPECTOR_CODE_REFERENCES', 'LEGAL_AGREEMENT_WORDING', 'YES_NO_OPTIONS', 'FIRESERVICE_PHASE2_OPTIONS', MetadataService]);
})();