/*
  * The contents of this file are subject to the Mozilla Public
  * License Version 1.1 (the "License"); you may not use this
  * file except in compliance with the License. You may obtain
  * a copy of the License at http://www.mozilla.org/MPL/
  *
  * Software distributed under the License is distributed on an
  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
  * or implied. See the License for the specific language governing
  * rights and limitations under the License.
  *
  *
  * The Original Code is .NET RASP toolkit.
  *
  * The Initial Developer of the Original Code is Accenture and Avanade.
  * Portions created by Accenture and Avanade are Copyright (C) 2007
  * Danish National IT and Telecom Agency (http://www.itst.dk). 
  * All Rights Reserved.
  *
  * Contributor(s):
  *   Gert Sylvest (gerts@avanade.com)
  *   Patrik Johansson (p.johansson@accenture.com)
  *   Michael Nielsen (michaelni@avanade.com)
  *   Dennis Søgaard (dennis.j.sogaard@accenture.com)
  *   Ramzi Fadel (ramzif@avanade.com)
  *   Mikkel Hippe Brun (mhb@itst.dk)
  *   Finn Hartmann Jordal (fhj@itst.dk)
  *   Christian Lanng (chl@itst.dk)
  *
  */
using System;
using System.Collections.Generic;


namespace dk.gov.oiosi.oioublProfileLibrary {
    
    /// <summary>
    /// The profile validator validates whether a Business Entity has all the services defined in the profile.
    /// </summary>
    public class OioublProfileValidator {
        private IOioublProfile _oioublProfile;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="profile">The profile to validate</param>
        public OioublProfileValidator(IOioublProfile profile) {
            _oioublProfile = profile;
        }

        /// <summary>
        /// Validates the Business Entity to see if the profile is fully supported.
        /// The profile is supported if all the document types in the profile are represented by a service in the Business Entity
        /// </summary>
        /// <param name="oioublServiceContainer"></param>
        /// <returns></returns>
        public OioublProfileValidationResult Validate(IOioublServiceCollection oioublServiceContainer) {

            List<OioublServiceDefinition> missingServiceDefinitions = new List<OioublServiceDefinition>();
            List<IOioublService> activeServices = new List<IOioublService>();
            List<IOioublService> unrelatedServices = new List<IOioublService>();

            bool profilReferenced = false;
            int profileServiceCount = 0;
            foreach (OioublServiceDefinition serviceDefinition in _oioublProfile.ServiceDefinitions) {
                profileServiceCount++;
                bool serviceDefinitionPresent = false;
                foreach (IOioublService service in oioublServiceContainer.OioublServices) {
                    if (service.HasServiceDefinition(serviceDefinition)) {
                        if (service.HasProcess(_oioublProfile)) {
                            activeServices.Add(service);
                            profilReferenced = true;
                        } else {
                            unrelatedServices.Add(service);
                        }
                        serviceDefinitionPresent = true;
                        //break;
                    }
                }
                if (!serviceDefinitionPresent) {
                    missingServiceDefinitions.Add(serviceDefinition);
                }
            }

            // Return validation result
            OioublProfileValidationResult validationResult = new OioublProfileValidationResult();
            validationResult.Success = activeServices.Count == profileServiceCount;;
            validationResult.ProfileReferenced = profilReferenced;
            validationResult.AddServicesActiveInProfile(activeServices);
            validationResult.AddServicesActiveInBusinessEntityButNotInProfile(unrelatedServices);
            validationResult.AddServicesMissingInProfile(missingServiceDefinitions);
            return validationResult;
        }



    }
}
