/**
 * PROCEDIMIENTO ALTERNATIVO - prc_api_create_OT_v2
 * 
 * Cambios vs versión original:
 * 1. RUT viene SIN guion (compatible con VARCHAR(10))
 * 2. Vehículos: INSERT IGNORE (no sobreescribe existentes, igual que Laravel)
 * 3. OT_Vehiculos: INSERT IGNORE (maneja duplicados)
 * 4. Validación adicional de técnico
 */

DELIMITER $$

DROP PROCEDURE IF EXISTS prc_api_create_OT_v2$$

CREATE PROCEDURE prc_api_create_OT_v2 (
    IN  p_rut_cliente      VARCHAR(10),   -- SIN guion: "123456785"
    IN  p_nombre_cliente   VARCHAR(50),   -- Limitado a 50 chars
    IN  p_direccion        VARCHAR(100),
    IN  p_comuna           VARCHAR(50),
    IN  p_telefono         VARCHAR(100),
    IN  p_email            VARCHAR(100),
    IN  p_rut_tecnico      VARCHAR(15),   -- SIN guion, pero permite más chars por seguridad
    IN  p_presGPS          VARCHAR(50),
    IN  p_tiposerv         VARCHAR(50),
    IN  p_taller_install   VARCHAR(100),
    IN  p_vehiculos_json   JSON,
    OUT p_resultado        CHAR(1),
    OUT p_mensaje          VARCHAR(255),
    OUT p_id_ot            INT
)
main_block: BEGIN

    DECLARE v_idx INT DEFAULT 0;
    DECLARE v_len INT DEFAULT 0;
    DECLARE v_patente VARCHAR(10);
    DECLARE v_marca VARCHAR(50);
    DECLARE v_modelo VARCHAR(50);
    DECLARE v_color VARCHAR(20);
    DECLARE v_anio VARCHAR(10);
    DECLARE v_empresa VARCHAR(100);
    DECLARE v_taller VARCHAR(256);
    DECLARE v_logo_taller VARCHAR(200);
    DECLARE v_logo_servicio VARCHAR(200);
    DECLARE v_motivo VARCHAR(100);
    DECLARE v_tecnico_exists INT DEFAULT 0;
    DECLARE v_vehiculos_insertados INT DEFAULT 0;
    DECLARE v_vehiculos_existentes INT DEFAULT 0;

    /* ERROR HANDLER */
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET p_resultado = 'F';
        SET p_mensaje = 'Error SQL en procedimiento';
        SET p_id_ot = NULL;
    END;

    /* ========================================================================
       VALIDACIONES
       ======================================================================== */

    /* Validar JSON */
    IF p_vehiculos_json IS NULL OR JSON_VALID(p_vehiculos_json) = 0 THEN
        SET p_resultado = 'F';
        SET p_mensaje = 'JSON de vehiculos invalido';
        SET p_id_ot = NULL;
        LEAVE main_block;
    END IF;

    SET v_len = JSON_LENGTH(p_vehiculos_json);
    IF v_len = 0 THEN
        SET p_resultado = 'F';
        SET p_mensaje = 'Debe incluir al menos un vehiculo';
        SET p_id_ot = NULL;
        LEAVE main_block;
    END IF;

    /* Validar que técnico existe (doble verificación) */
    SELECT COUNT(*) INTO v_tecnico_exists 
    FROM Tecnicos 
    WHERE rut_tecnico = p_rut_tecnico;
    
    IF v_tecnico_exists = 0 THEN
        SET p_resultado = 'F';
        SET p_mensaje = 'Tecnico no existe en el sistema';
        SET p_id_ot = NULL;
        LEAVE main_block;
    END IF;

    /* ========================================================================
       MAPEOS
       ======================================================================== */

    /* GPS PROVIDER → empresa + logo_servicio */
    CASE p_presGPS
        WHEN 'gpsimple' THEN 
            SET v_empresa = 'gpsimple';
            SET v_logo_servicio = 'https://media.recuperauto.cl/Media/Cartec/gpsimple-logo.png';
        WHEN 'entel' THEN 
            SET v_empresa = 'entel';
            SET v_logo_servicio = 'https://media.recuperauto.cl/Media/Cartec/follow-logo.png';
        WHEN 'tattersall' THEN 
            SET v_empresa = 'tattersall';
            SET v_logo_servicio = 'https://media.recuperauto.cl/Media/Cartec/tattersall.png';
        WHEN 'cemin' THEN 
            SET v_empresa = 'cemin';
            SET v_logo_servicio = 'https://media.recuperauto.cl/Media/Cartec/cemin.png';
        WHEN 'carflex' THEN 
            SET v_empresa = 'carflex';
            SET v_logo_servicio = 'https://media.recuperauto.cl/Media/Cartec/carflex.png';
        ELSE
            SET p_resultado = 'F';
            SET p_mensaje = 'Proveedor GPS no valido';
            SET p_id_ot = NULL;
            LEAVE main_block;
    END CASE;

    /* TIPO SERVICIO → motivo */
    IF p_tiposerv = 'instalacion_gps' THEN
        CASE p_presGPS
            WHEN 'gpsimple' THEN SET v_motivo = 'Instalación GPS';
            WHEN 'entel' THEN SET v_motivo = 'Instalación GPS FollowMyCar';
            WHEN 'tattersall' THEN SET v_motivo = 'Instalación GPS Tattersall';
            WHEN 'cemin' THEN SET v_motivo = 'Instalación GPS Cemin';
            WHEN 'carflex' THEN SET v_motivo = 'Instalación GPS CarFlex';
            ELSE SET v_motivo = 'Instalación GPS';
        END CASE;
    ELSEIF p_tiposerv = 'visita_tecnica' THEN 
        SET v_motivo = 'Visita_tecnica GPS';
    ELSEIF p_tiposerv = 'desinstalacion_gps' THEN 
        SET v_motivo = 'Desinstalación GPS';
    ELSE 
        SET v_motivo = 'Visita_tecnica GPS';
    END IF;

    /* TALLER → taller + logo_taller */
    CASE p_taller_install
        WHEN 'cartec' THEN 
            SET v_taller = 'domicilio';
            SET v_logo_taller = 'https://media.recuperauto.cl/Media/Cartec/cartec-logo.png';
        WHEN 'servitattersall' THEN 
            SET v_taller = 'servitattersall';
            SET v_logo_taller = 'https://media.recuperauto.cl/Media/Cartec/servitattersall-logo.svg';
        ELSE 
            SET v_taller = 'domicilio';
            SET v_logo_taller = 'https://media.recuperauto.cl/Media/Cartec/cartec-logo.png';
    END CASE;

    /* ========================================================================
       TRANSACCIÓN
       ======================================================================== */

    START TRANSACTION;

    /* --------------------------------------------------------------------
       CLIENTE: UPSERT (necesario por FK)
       -------------------------------------------------------------------- */
    IF EXISTS (SELECT 1 FROM Clientes WHERE rut_cliente = p_rut_cliente) THEN
        UPDATE Clientes
        SET nombre = p_nombre_cliente,
            direccion = p_direccion,
            comuna = p_comuna,
            telefono = p_telefono,
            email = p_email,
            actualizado_en = NOW()
        WHERE rut_cliente = p_rut_cliente;
    ELSE
        INSERT INTO Clientes (
            rut_cliente,
            nombre,
            direccion,
            comuna,
            telefono,
            email,
            creado_en
        ) VALUES (
            p_rut_cliente,
            p_nombre_cliente,
            p_direccion,
            p_comuna,
            p_telefono,
            p_email,
            NOW()
        );
    END IF;

    /* --------------------------------------------------------------------
       OT: INSERT
       -------------------------------------------------------------------- */
    INSERT INTO OT (
        fecha,
        rut_cliente,
        rut_tecnico,
        direccion_instalacion,
        comuna_instalacion,
        telefono_instalacion,
        email_instalacion,
        estado_ot,
        empresa,
        taller,
        motivo,
        logo_taller,
        logo_servicio,
        fecha_serv,
        creado_en,
        actualizado_en
    ) VALUES (
        NOW(),
        p_rut_cliente,
        p_rut_tecnico,
        p_direccion,
        p_comuna,
        p_telefono,
        p_email,
        'pendiente',
        v_empresa,
        v_taller,
        v_motivo,
        v_logo_taller,
        v_logo_servicio,
        CURDATE(),
        NOW(),
        NOW()
    );

    SET p_id_ot = LAST_INSERT_ID();

    /* --------------------------------------------------------------------
       VEHÍCULOS: LOOP
       -------------------------------------------------------------------- */
    WHILE v_idx < v_len DO

        SET v_patente = JSON_UNQUOTE(JSON_EXTRACT(p_vehiculos_json, CONCAT('$[', v_idx, '].patente')));
        SET v_marca   = JSON_UNQUOTE(JSON_EXTRACT(p_vehiculos_json, CONCAT('$[', v_idx, '].marca')));
        SET v_modelo  = JSON_UNQUOTE(JSON_EXTRACT(p_vehiculos_json, CONCAT('$[', v_idx, '].modelo')));
        SET v_color   = COALESCE(JSON_UNQUOTE(JSON_EXTRACT(p_vehiculos_json, CONCAT('$[', v_idx, '].color'))), 'NO INFORMADO');
        SET v_anio    = JSON_UNQUOTE(JSON_EXTRACT(p_vehiculos_json, CONCAT('$[', v_idx, '].anio')));

        /* Validar patente requerida */
        IF v_patente IS NULL OR v_patente = '' OR v_patente = 'null' THEN
            SET p_resultado = 'F';
            SET p_mensaje = CONCAT('Patente requerida para vehiculo ', v_idx);
            SET p_id_ot = NULL;
            ROLLBACK;
            LEAVE main_block;
        END IF;

        SET v_patente = UPPER(v_patente);

        /* ----------------------------------------------------------------
           VEHÍCULO: INSERT IGNORE (no sobreescribe existentes)
           Comportamiento igual a Laravel: DB::table('Vehiculos')->insertOrIgnore()
           ---------------------------------------------------------------- */
        INSERT IGNORE INTO Vehiculos (
            patente,
            marca,
            modelo,
            color,
            anio,
            creado_en
        ) VALUES (
            v_patente,
            v_marca,
            v_modelo,
            v_color,
            v_anio,
            NOW()
        );

        /* Contar si fue insertado o ya existía */
        IF ROW_COUNT() > 0 THEN
            SET v_vehiculos_insertados = v_vehiculos_insertados + 1;
        ELSE
            SET v_vehiculos_existentes = v_vehiculos_existentes + 1;
        END IF;

        /* ----------------------------------------------------------------
           OT_VEHICULOS: INSERT IGNORE (maneja duplicados)
           ---------------------------------------------------------------- */
        INSERT IGNORE INTO OT_Vehiculos (id_ot, patente) 
        VALUES (p_id_ot, v_patente);

        SET v_idx = v_idx + 1;

    END WHILE;

    COMMIT;

    SET p_resultado = 'T';
    SET p_mensaje = CONCAT(
        'OT creada ID: ', p_id_ot, 
        ' | Vehiculos nuevos: ', v_vehiculos_insertados,
        ' | Existentes: ', v_vehiculos_existentes
    );

END main_block$$

DELIMITER ;

/* ============================================================================
   NOTAS DE DIFERENCIAS CON prc_api_create_OT (v1)
   ============================================================================

   1. RUT SIN GUION
      - v1: Acepta "12345678-5" (11 chars) → puede truncarse en VARCHAR(10)
      - v2: Espera "123456785" (9 chars) → compatible con VARCHAR(10)
   
   2. VEHÍCULOS INSERT IGNORE vs UPDATE
      - v1: Si vehículo existe → UPDATE (sobreescribe datos)
      - v2: Si vehículo existe → IGNORE (mantiene datos originales)
      - Razón: Comportamiento consistente con Laravel (insertOrIgnore)
   
   3. OT_VEHICULOS INSERT IGNORE
      - v1: INSERT normal → falla si patente duplicada en misma OT
      - v2: INSERT IGNORE → ignora duplicados silenciosamente
   
   4. MENSAJE DE RESPUESTA
      - v1: "OT creada correctamente ID: X Vehiculos: Y"
      - v2: "OT creada ID: X | Vehiculos nuevos: Y | Existentes: Z"
   
   5. VALIDACIÓN DE TÉCNICO EN PROCEDIMIENTO
      - v1: No valida (confía en API)
      - v2: Valida existencia como doble verificación

   ============================================================================ */

