USE peluqueria;

INSERT IGNORE INTO categoria_servicio(csv_nombre) VALUES ('EXTRAS');

INSERT INTO servicios(csv_id, ser_nombre, ser_precio, ser_comision_pct, ser_duracion_min, ser_activo)
SELECT csv_id, 'Extra de servicio', 0.00, 30.00, 5, 1
FROM categoria_servicio
WHERE csv_nombre = 'EXTRAS'
  AND NOT EXISTS (SELECT 1 FROM servicios WHERE ser_nombre = 'Extra de servicio');

DELIMITER $$

DROP PROCEDURE IF EXISTS spu_caja_reaperturar $$
CREATE PROCEDURE spu_caja_reaperturar(IN p_caj_id INT, IN p_observacion TEXT)
BEGIN
  DECLARE v_estado VARCHAR(20);
  DECLARE v_conforme TINYINT;
  DECLARE v_suc_id INT;

  SELECT caj_estado, caj_conforme, suc_id INTO v_estado, v_conforme, v_suc_id
  FROM caja
  WHERE caj_id = p_caj_id
  LIMIT 1;

  IF v_estado IS NULL THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Caja no encontrada';
  END IF;

  IF EXISTS (SELECT 1 FROM caja WHERE suc_id = v_suc_id AND caj_estado = 'ABIERTA') THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Ya existe una caja abierta';
  END IF;

  IF v_estado <> 'CERRADA' OR v_conforme <> 1 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Solo puede reaperturar una caja cerrada con conformidad';
  END IF;

  UPDATE caja
     SET caj_estado = 'ABIERTA',
         caj_cierre = NULL,
         caj_conforme = 0,
         caj_fecconformidad = NULL,
         caj_conformidad_observ = CONCAT('Reapertura: ', COALESCE(p_observacion, ''))
   WHERE caj_id = p_caj_id;

  INSERT INTO caja_movimientos(caj_id, cam_tipo, cam_monto, cam_observacion)
  VALUES(p_caj_id, 'APERTURA', 0, CONCAT('Reapertura de caja. ', COALESCE(p_observacion, '')));

  SELECT * FROM caja WHERE caj_id = p_caj_id;
END $$

DROP PROCEDURE IF EXISTS spu_trabajador_estado $$
CREATE PROCEDURE spu_trabajador_estado(IN p_tra_id INT, IN p_activo TINYINT)
BEGIN
  UPDATE trabajadores SET tra_activo = p_activo WHERE tra_id = p_tra_id;
  SELECT * FROM trabajadores WHERE tra_id = p_tra_id;
END $$

DROP PROCEDURE IF EXISTS spu_atencion_reg $$
CREATE PROCEDURE spu_atencion_reg(
  IN p_suc_id INT,
  IN p_cli_id INT,
  IN p_observacion TEXT,
  IN p_servicios JSON
)
BEGIN
  DECLARE v_atn_id INT;
  DECLARE v_idx INT DEFAULT 0;
  DECLARE v_len INT DEFAULT 0;
  DECLARE v_ser_id INT;
  DECLARE v_tra_id INT;
  DECLARE v_cantidad DECIMAL(12,2);
  DECLARE v_precio DECIMAL(12,2);
  DECLARE v_precio_json DECIMAL(12,2);
  DECLARE v_comision DECIMAL(5,2);

  INSERT INTO atenciones(suc_id, cli_id, atn_observacion)
  VALUES(p_suc_id, NULLIF(p_cli_id, 0), p_observacion);

  SET v_atn_id = LAST_INSERT_ID();
  UPDATE atenciones SET atn_codigo = CONCAT('AT-', DATE_FORMAT(NOW(), '%Y%m%d'), '-', LPAD(v_atn_id, 5, '0'))
  WHERE atn_id = v_atn_id;

  SET v_len = COALESCE(JSON_LENGTH(p_servicios), 0);

  WHILE v_idx < v_len DO
    SET v_ser_id = CAST(JSON_UNQUOTE(JSON_EXTRACT(p_servicios, CONCAT('$[', v_idx, '].ser_id'))) AS UNSIGNED);
    SET v_tra_id = CAST(JSON_UNQUOTE(JSON_EXTRACT(p_servicios, CONCAT('$[', v_idx, '].tra_id'))) AS UNSIGNED);
    SET v_cantidad = COALESCE(CAST(JSON_UNQUOTE(JSON_EXTRACT(p_servicios, CONCAT('$[', v_idx, '].cantidad'))) AS DECIMAL(12,2)), 1);
    SET v_precio_json = COALESCE(CAST(JSON_UNQUOTE(JSON_EXTRACT(p_servicios, CONCAT('$[', v_idx, '].precio'))) AS DECIMAL(12,2)), 0);

    SELECT CASE WHEN v_precio_json > 0 THEN v_precio_json ELSE ser_precio END, ser_comision_pct
      INTO v_precio, v_comision
      FROM servicios
     WHERE ser_id = v_ser_id;

    INSERT INTO atencion_detalle_servicios(atn_id, ser_id, tra_id, ads_cantidad, ads_precio, ads_total, ads_comision_pct)
    VALUES(v_atn_id, v_ser_id, v_tra_id, v_cantidad, v_precio, v_cantidad * v_precio, v_comision);

    SET v_idx = v_idx + 1;
  END WHILE;

  SELECT * FROM atenciones WHERE atn_id = v_atn_id;
END $$

DELIMITER ;
