/* Copyright © 2017 AT&T, Amdocs, Bell Canada
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#
# CLDS stored procedures
#

USE cldsdb4;

DROP PROCEDURE IF EXISTS upd_event;
DROP PROCEDURE IF EXISTS ins_event;
DROP PROCEDURE IF EXISTS del_all_model_instances;
DROP PROCEDURE IF EXISTS del_model_instance;
DROP PROCEDURE IF EXISTS ins_model_instance;
DROP PROCEDURE IF EXISTS set_model;
DROP PROCEDURE IF EXISTS get_model;
DROP PROCEDURE IF EXISTS get_model_template;
DROP PROCEDURE IF EXISTS set_template;
DROP PROCEDURE IF EXISTS get_template;
DROP PROCEDURE IF EXISTS del_model;
DROP PROCEDURE IF EXISTS set_new_tosca_model_version;
DROP PROCEDURE IF EXISTS set_tosca_model;
DROP PROCEDURE IF EXISTS set_dictionary;
DROP PROCEDURE IF EXISTS set_dictionary_elements;
DELIMITER //
CREATE PROCEDURE get_template
  (IN v_template_name VARCHAR(80),
   OUT v_template_id VARCHAR(36),
   OUT v_template_bpmn_id VARCHAR(36),
   OUT v_template_bpmn_user_id VARCHAR(80),
   OUT v_template_bpmn_text MEDIUMTEXT,
   OUT v_template_image_id VARCHAR(36),
   OUT v_template_image_user_id VARCHAR(80),
   OUT v_template_image_text MEDIUMTEXT,
   OUT v_template_doc_id VARCHAR(36),
   OUT v_template_doc_user_id VARCHAR(80),
   OUT v_template_doc_text MEDIUMTEXT)
BEGIN
  SELECT t.template_id,
		 tb.template_bpmn_id,
		 tb.user_id,
		 tb.template_bpmn_text,
		 ti.template_image_id,
		 ti.user_id,
		 ti.template_image_text,
		 td.template_doc_id,
		 td.user_id,
		 td.template_doc_text
    INTO v_template_id,
         v_template_bpmn_id,
         v_template_bpmn_user_id,
         v_template_bpmn_text,
         v_template_image_id,
         v_template_image_user_id,
         v_template_image_text,
         v_template_doc_id,
         v_template_doc_user_id,
         v_template_doc_text
    FROM template t,
         template_bpmn tb,
		 template_image ti,
		 template_doc td
    WHERE t.template_bpmn_id = tb.template_bpmn_id
	  AND t.template_image_id = ti.template_image_id
	  AND t.template_doc_id = td.template_doc_id
      AND t.template_name = v_template_name;
END;
CREATE PROCEDURE set_template
  (IN v_template_name VARCHAR(80),
   IN v_user_id VARCHAR(80),
   IN v_template_bpmn_text MEDIUMTEXT,
   IN v_template_image_text MEDIUMTEXT,
   IN v_template_doc_text MEDIUMTEXT,
   OUT v_template_id VARCHAR(36),
   OUT v_template_bpmn_id VARCHAR(36),
   OUT v_template_bpmn_user_id VARCHAR(80),
   OUT v_template_image_id VARCHAR(36),
   OUT v_template_image_user_id VARCHAR(80),
   OUT v_template_doc_id VARCHAR(36),
   OUT v_template_doc_user_id VARCHAR(80))
BEGIN
  DECLARE v_old_template_bpmn_text MEDIUMTEXT;
  DECLARE v_old_template_image_text MEDIUMTEXT;
  DECLARE v_old_template_doc_text MEDIUMTEXT;
  SET v_template_id = NULL;
  CALL get_template(
    v_template_name,
    v_template_id,
    v_template_bpmn_id,
    v_template_bpmn_user_id,
    v_old_template_bpmn_text,
    v_template_image_id,
    v_template_image_user_id,
    v_old_template_image_text,
    v_template_doc_id,
    v_template_doc_user_id,
    v_old_template_doc_text);
  IF v_template_id IS NULL THEN
    BEGIN
	  SET v_template_id = UUID();
      INSERT INTO template
	    (template_id, template_name)
	    VALUES (v_template_id, v_template_name);
	END;
  END IF;
  IF v_template_bpmn_id IS NULL OR v_template_bpmn_text <> v_old_template_bpmn_text THEN
	SET v_template_bpmn_id = UUID();
    INSERT INTO template_bpmn
	  (template_bpmn_id, template_id, template_bpmn_text, user_id)
	  VALUES (v_template_bpmn_id, v_template_id, v_template_bpmn_text, v_user_id);
	SET v_template_bpmn_user_id = v_user_id;
  END IF;
  IF v_template_image_id IS NULL OR v_template_image_text <> v_old_template_image_text THEN
	SET v_template_image_id = UUID();
    INSERT INTO template_image
	  (template_image_id, template_id, template_image_text, user_id)
	  VALUES (v_template_image_id, v_template_id, v_template_image_text, v_user_id);
	SET v_template_image_user_id = v_user_id;
  END IF;
  IF v_template_doc_id IS NULL OR v_template_doc_text <> v_old_template_doc_text THEN
	SET v_template_doc_id = UUID();
    INSERT INTO template_doc
	  (template_doc_id, template_id, template_doc_text, user_id)
	  VALUES (v_template_doc_id, v_template_id, v_template_doc_text, v_user_id);
	SET v_template_doc_user_id = v_user_id;
  END IF;
  UPDATE template
    SET template_bpmn_id = v_template_bpmn_id,
	    template_image_id = v_template_image_id,
	    template_doc_id = v_template_doc_id
    WHERE template_id = v_template_id;
END;
CREATE PROCEDURE get_model
  (IN v_model_name VARCHAR(80),
   OUT v_control_name_prefix VARCHAR(80),
   INOUT v_control_name_uuid VARCHAR(36),
   OUT v_model_id VARCHAR(36),
   OUT v_service_type_id VARCHAR(80),
   OUT v_deployment_id VARCHAR(80),
   OUT v_deployment_status_url VARCHAR(300),
   OUT v_template_name VARCHAR(80),
   OUT v_template_id VARCHAR(36),
   OUT v_model_prop_id VARCHAR(36),
   OUT v_model_prop_user_id VARCHAR(80),
   OUT v_model_prop_text MEDIUMTEXT,
   OUT v_model_blueprint_id VARCHAR(36),
   OUT v_model_blueprint_user_id VARCHAR(80),
   OUT v_model_blueprint_text MEDIUMTEXT,
   OUT v_event_id VARCHAR(36),
   OUT v_action_cd VARCHAR(80),
   OUT v_action_state_cd VARCHAR(80),
   OUT v_event_process_instance_id VARCHAR(80),
   OUT v_event_user_id VARCHAR(80))
BEGIN
  SELECT m.control_name_prefix,
		 m.control_name_uuid,
		 m.model_id,
		 m.service_type_id,
		 m.deployment_id,
		 m.deployment_status_url,
		 t.template_name,
		 m.template_id,
		 mp.model_prop_id,
		 mp.user_id,
		 mp.model_prop_text,
		 mb.model_blueprint_id,
		 mb.user_id,
		 mb.model_blueprint_text,
		 e.event_id,
		 e.action_cd,
		 e.action_state_cd,
		 e.process_instance_id,
		 e.user_id
    INTO v_control_name_prefix,
         v_control_name_uuid,
		 v_model_id,
		 v_service_type_id,
		 v_deployment_id,
		 v_deployment_status_url,
		 v_template_name,
         v_template_id,
         v_model_prop_id,
         v_model_prop_user_id,
         v_model_prop_text,
         v_model_blueprint_id,
         v_model_blueprint_user_id,
         v_model_blueprint_text,
         v_event_id,
         v_action_cd,
		 v_action_state_cd,
         v_event_process_instance_id,
         v_event_user_id
    FROM model m,
		 template t,
		 model_properties mp,
		 model_blueprint mb,
		 event e
    WHERE m.template_id = t.template_id
	  AND m.model_prop_id = mp.model_prop_id
	  AND m.model_blueprint_id = mb.model_blueprint_id
	  AND m.event_id = e.event_id
      AND (m.model_name = v_model_name
      OR  m.control_name_uuid = v_control_name_uuid);
    SELECT model_instance_id,
           vm_name,
           location,
           timestamp
    FROM model_instance
    WHERE model_id = v_model_id
    ORDER BY 2;
END;
CREATE PROCEDURE get_model_template
  (IN v_model_name VARCHAR(80),
   OUT v_control_name_prefix VARCHAR(80),
   INOUT v_control_name_uuid VARCHAR(36),
   OUT v_model_id VARCHAR(36),
   OUT v_service_type_id VARCHAR(80),
   OUT v_deployment_id VARCHAR(80),
   OUT v_deployment_status_url VARCHAR(300),
   OUT v_template_name VARCHAR(80),
   OUT v_template_id VARCHAR(36),
   OUT v_model_prop_id VARCHAR(36),
   OUT v_model_prop_user_id VARCHAR(80),
   OUT v_model_prop_text MEDIUMTEXT,
   OUT v_model_blueprint_id VARCHAR(36),
   OUT v_model_blueprint_user_id VARCHAR(80),
   OUT v_model_blueprint_text MEDIUMTEXT,
   OUT v_template_bpmn_id VARCHAR(36),
   OUT v_template_bpmn_user_id VARCHAR(80),
   OUT v_template_bpmn_text MEDIUMTEXT,
   OUT v_template_image_id VARCHAR(36),
   OUT v_template_image_user_id VARCHAR(80),
   OUT v_template_image_text MEDIUMTEXT,
   OUT v_template_doc_id VARCHAR(36),
   OUT v_template_doc_user_id VARCHAR(80),
   OUT v_template_doc_text MEDIUMTEXT,
   OUT v_event_id VARCHAR(36),
   OUT v_action_cd VARCHAR(80),
   OUT v_action_state_cd VARCHAR(80),
   OUT v_event_process_instance_id VARCHAR(80),
   OUT v_event_user_id VARCHAR(80))
BEGIN
  CALL get_model(
    v_model_name,
    v_control_name_prefix,
    v_control_name_uuid,
    v_model_id,
	v_service_type_id,
	v_deployment_id,
	v_deployment_status_url,
    v_template_name,
    v_template_id,
    v_model_prop_id,
    v_model_prop_user_id,
    v_model_prop_text,
    v_model_blueprint_id,
    v_model_blueprint_user_id,
    v_model_blueprint_text,
	v_event_id,
	v_action_cd,
	v_action_state_cd,
	v_event_process_instance_id,
	v_event_user_id);
  CALL get_template(
    v_template_name,
    v_template_id,
    v_template_bpmn_id,
    v_template_bpmn_user_id,
    v_template_bpmn_text,
    v_template_image_id,
    v_template_image_user_id,
    v_template_image_text,
    v_template_doc_id,
    v_template_doc_user_id,
    v_template_doc_text);
  END;
CREATE PROCEDURE set_model
  (IN v_model_name VARCHAR(80),
   IN v_template_id VARCHAR(36),
   IN v_user_id VARCHAR(80),
   IN v_model_prop_text MEDIUMTEXT,
   IN v_model_blueprint_text MEDIUMTEXT,
   IN v_service_type_id VARCHAR(80),
   IN v_deployment_id VARCHAR(80),
   IN v_deployment_status_url VARCHAR(300),
   INOUT v_control_name_prefix VARCHAR(80),
   INOUT v_control_name_uuid VARCHAR(36),
   OUT v_model_id VARCHAR(36),
   OUT v_model_prop_id VARCHAR(36),
   OUT v_model_prop_user_id VARCHAR(80),
   OUT v_model_blueprint_id VARCHAR(36),
   OUT v_model_blueprint_user_id VARCHAR(80),
   OUT v_event_id VARCHAR(36),
   OUT v_action_cd VARCHAR(80),
   OUT v_action_state_cd VARCHAR(80),
   OUT v_event_process_instance_id VARCHAR(80),
   OUT v_event_user_id VARCHAR(80))
BEGIN
  DECLARE v_old_template_name VARCHAR(80);
  DECLARE v_old_template_id VARCHAR(36);
  DECLARE v_old_control_name_prefix VARCHAR(80);
  DECLARE v_old_control_name_uuid VARCHAR(36);
  DECLARE v_old_model_prop_text MEDIUMTEXT;
  DECLARE v_old_model_blueprint_text MEDIUMTEXT;
  DECLARE v_old_service_type_id VARCHAR(80);
  DECLARE v_old_deployment_id VARCHAR(80);
  DECLARE v_old_deployment_status_url VARCHAR(300);
  SET v_model_id = NULL;
  CALL get_model(
    v_model_name,
    v_old_control_name_prefix,
    v_old_control_name_uuid,
    v_model_id,
	v_old_service_type_id,
	v_old_deployment_id,
	v_old_deployment_status_url,
    v_old_template_name,
    v_old_template_id,
    v_model_prop_id,
    v_model_prop_user_id,
    v_old_model_prop_text,
    v_model_blueprint_id,
    v_model_blueprint_user_id,
    v_old_model_blueprint_text,
	v_event_id,
	v_action_cd,
	v_action_state_cd,
	v_event_process_instance_id,
	v_event_user_id);
  IF v_model_id IS NULL THEN
    BEGIN
      # UUID can be provided initially but cannot be updated
	  # if not provided (this is expected) then it will be set here
      IF v_control_name_uuid IS NULL THEN
	    SET v_control_name_uuid = UUID();
	  END IF;
      SET v_model_id = v_control_name_uuid;
      INSERT INTO model
	    (model_id, model_name, template_id, control_name_prefix, control_name_uuid, service_type_id, deployment_id, deployment_status_url)
	    VALUES (v_model_id, v_model_name, v_template_id, v_control_name_prefix, v_control_name_uuid, v_service_type_id, v_deployment_id,v_deployment_status_url);
	  # since just created model, insert CREATED event as initial default event
	  SET v_action_cd = 'CREATE';
	  SET v_action_state_cd = 'COMPLETED';
	  SET v_event_user_id = v_user_id;
      SET v_event_id = UUID();
      INSERT INTO event
	    (event_id, model_id, action_cd, action_state_cd, user_id)
	    VALUES (v_event_id, v_model_id, v_action_cd, v_action_state_cd, v_event_user_id);
	  UPDATE model
		SET event_id = v_event_id
		WHERE model_id = v_model_id;
	END;
  ELSE
    BEGIN
	  # use old control_name_prefix if null value is provided
      IF v_control_name_prefix IS NULL THEN
	     SET v_control_name_prefix = v_old_control_name_prefix;
	  END IF;
	  # UUID can not be updated after initial insert
	  SET v_control_name_uuid = v_old_control_name_uuid;
	END;
  END IF;
  IF v_model_prop_id IS NULL OR v_model_prop_text <> v_old_model_prop_text THEN
	SET v_model_prop_id = UUID();
    INSERT INTO model_properties
	  (model_prop_id, model_id, model_prop_text, user_id)
	  VALUES (v_model_prop_id, v_model_id, v_model_prop_text, v_user_id);
	SET v_model_prop_user_id = v_user_id;
  END IF;
  IF v_model_blueprint_id IS NULL OR v_model_blueprint_text <> v_old_model_blueprint_text THEN
	SET v_model_blueprint_id = UUID();
    INSERT INTO model_blueprint
	  (model_blueprint_id, model_id, model_blueprint_text, user_id)
	  VALUES (v_model_blueprint_id, v_model_id, v_model_blueprint_text, v_user_id);
	SET v_model_blueprint_user_id = v_user_id;
  END IF;
  UPDATE model
    SET control_name_prefix = v_control_name_prefix,
	    model_prop_id = v_model_prop_id,
	    model_blueprint_id = v_model_blueprint_id,
	    service_type_id = v_service_type_id,
	    deployment_id = v_deployment_id,
	    deployment_status_url = v_deployment_status_url
    WHERE model_id = v_model_id;
END;
CREATE PROCEDURE ins_model_instance
  (IN v_control_name_uuid VARCHAR(36),
   IN v_vm_name VARCHAR(250),
   IN v_location VARCHAR(250),
   OUT v_model_id VARCHAR(36),
   OUT v_model_instance_id VARCHAR(36))
BEGIN
   SELECT m.model_id
    INTO v_model_id
    FROM model m
    WHERE m.control_name_uuid = v_control_name_uuid;
  SET v_model_instance_id = UUID();
  INSERT INTO model_instance
	(model_instance_id, model_id, vm_name, location)
	VALUES (v_model_instance_id, v_model_id, v_vm_name, v_location);
END;
CREATE PROCEDURE del_model_instance
  (IN v_control_name_uuid VARCHAR(36),
   IN v_vm_name VARCHAR(250),
   OUT v_model_id VARCHAR(36),
   OUT v_model_instance_id VARCHAR(36))
BEGIN
   SELECT m.model_id, i.model_instance_id
    INTO v_model_id,
         v_model_instance_id
    FROM model m,
         model_instance i
    WHERE m.model_id = i.model_id
     AND  m.control_name_uuid = v_control_name_uuid
     AND  i.vm_name = v_vm_name;
  DELETE FROM model_instance
  WHERE model_instance_id = v_model_instance_id;
END;
CREATE PROCEDURE del_all_model_instances
  (IN v_control_name_uuid VARCHAR(36),
   OUT v_model_id VARCHAR(36))
BEGIN
  SELECT m.model_id
    INTO v_model_id
    FROM model m
    WHERE m.control_name_uuid = v_control_name_uuid;
  DELETE FROM model_instance
  WHERE model_id = v_model_id;
END;
CREATE PROCEDURE ins_event
  (IN v_model_name VARCHAR(80),
   IN v_control_name_prefix VARCHAR(80),
   IN v_control_name_uuid VARCHAR(36),
   IN v_user_id VARCHAR(80),
   IN v_action_cd VARCHAR(80),
   IN v_action_state_cd VARCHAR(80),
   IN v_process_instance_id VARCHAR(80),
   OUT v_model_id VARCHAR(36),
   OUT v_event_id VARCHAR(36))
BEGIN
  DECLARE v_prev_event_id VARCHAR(36);
  SELECT m.model_id,
		 m.event_id
    INTO v_model_id,
         v_prev_event_id
    FROM model m
    WHERE m.model_name = v_model_name
	  OR  m.control_name_uuid = v_control_name_uuid;
  SET v_event_id = UUID();
  INSERT INTO event
	(event_id, model_id, action_cd, action_state_cd, prev_event_id, process_instance_id, user_id)
	VALUES (v_event_id, v_model_id, v_action_cd, v_action_state_cd, v_prev_event_id, v_process_instance_id, v_user_id);
  UPDATE model
	SET event_id = v_event_id
	WHERE model_id = v_model_id;
END;
CREATE PROCEDURE upd_event
  (IN v_event_id VARCHAR(36),
   IN v_process_instance_id VARCHAR(80))
BEGIN
  UPDATE event
	SET process_instance_id = v_process_instance_id
	WHERE event_id = v_event_id;
END;
CREATE PROCEDURE del_model
(IN v_model_name VARCHAR(80))
BEGIN
    DECLARE v_model_id VARCHAR(36);
    SELECT model_id INTO v_model_id from model where model_name = v_model_name;
    UPDATE model set event_id = null, model_blueprint_id = null, model_prop_id = null where model_id = v_model_id;
	DELETE from event where model_id = v_model_id;
	DELETE from model_blueprint where model_id = v_model_id;
	DELETE from model_properties where model_id = v_model_id;
    DELETE from model where model_id = v_model_id;
END;

CREATE PROCEDURE set_new_tosca_model_version
  (IN v_tosca_model_id VARCHAR(36),
   IN v_version DOUBLE,
   IN v_tosca_model_yaml MEDIUMTEXT,
   IN v_tosca_model_json MEDIUMTEXT,
   IN v_user_id VARCHAR(80),
   OUT v_revision_id VARCHAR(36))
BEGIN
  SET v_revision_id = UUID();
  INSERT INTO tosca_model_revision
    (tosca_model_revision_id, tosca_model_id, version, tosca_model_yaml, tosca_model_json, user_id)
    VALUES (v_revision_id, v_tosca_model_id, v_version, v_tosca_model_yaml, v_tosca_model_json, v_user_id);
END;

CREATE PROCEDURE set_tosca_model
  (IN v_tosca_model_name VARCHAR(80),
   IN v_policy_type VARCHAR(80),
   IN v_user_id VARCHAR(80),
   IN v_tosca_model_yaml MEDIUMTEXT,
   IN v_tosca_model_json MEDIUMTEXT,
   IN v_version DOUBLE,
   OUT v_tosca_model_id VARCHAR(36),
   OUT v_revision_id VARCHAR(36))
BEGIN
  SET v_tosca_model_id = UUID();
  INSERT INTO tosca_model
    (tosca_model_id, tosca_model_name, policy_type, user_id)
    VALUES (v_tosca_model_id, v_tosca_model_name, v_policy_type, v_user_id);
  SET v_revision_id = UUID();
  INSERT INTO tosca_model_revision
    (tosca_model_revision_id, tosca_model_id, version, tosca_model_yaml, tosca_model_json, user_id)
    VALUES (v_revision_id, v_tosca_model_id, v_version, v_tosca_model_yaml, v_tosca_model_json, v_user_id);
END;

CREATE PROCEDURE set_dictionary
  (IN v_dictionary_name VARCHAR(80),
   IN v_user_id VARCHAR(80),
   OUT v_dictionary_id VARCHAR(36))
BEGIN
  SET v_dictionary_id = UUID();
  INSERT INTO dictionary
    (dictionary_id, dictionary_name, created_by, modified_by)
    VALUES (v_dictionary_id, v_dictionary_name, v_user_id, v_user_id);
END;

CREATE PROCEDURE set_dictionary_elements
  (IN v_dictionary_id VARCHAR(36),
   IN v_dict_element_name VARCHAR(250),
   IN v_dict_element_short_name VARCHAR(80),
   IN v_dict_element_description VARCHAR(250),
   IN v_dict_element_type VARCHAR(80),
   IN v_user_id VARCHAR(80),
   OUT v_dict_element_id VARCHAR(36))
BEGIN
  SET v_dict_element_id = UUID();
  INSERT INTO dictionary_elements
    (dict_element_id, dictionary_id, dict_element_name, dict_element_short_name, dict_element_description, dict_element_type, created_by, modified_by)
    VALUES (v_dict_element_id, v_dictionary_id, v_dict_element_name, v_dict_element_short_name, v_dict_element_description, v_dict_element_type, v_user_id, v_user_id);
END;
//
DELIMITER ;
