DELIMITER $$

DROP PROCEDURE IF EXISTS prc_api_create_OT$$

CREATE PROCEDURE prc_api_create_OT (
    IN  p_rut_cliente      VARCHAR(15),
    IN  p_nombre_cliente   VARCHAR(255),
    IN  p_direccion        VARCHAR(255),
    IN  p_comuna           VARCHAR(100),
    IN  p_telefono         VARCHAR(50),
    IN  p_email            VARCHAR(255),
    IN  p_rut_tecnico      VARCHAR(15),
    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_vehiculo_exists INT DEFAULT 0;
    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);

    /* 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;

    /* VALIDATE 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;

    /* GPS PROVIDER VALIDATION & MAPPING */
    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;

    /* SERVICE TYPE MAPPING */
    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 MAPPING */
    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;

    START TRANSACTION;

    /* UPSERT CLIENT - Required due to foreign key constraint */
    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;

    /* CREATE OT - Using existing OT table */
    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();

    /* VEHICLES 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')));

        /* VALIDATE REQUIRED FIELDS */
        IF v_patente IS NULL OR v_patente = '' 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);

        /* CHECK IF VEHICLE EXISTS - Using existing Vehiculos table */
        SELECT COUNT(*) INTO v_vehiculo_exists 
        FROM Vehiculos 
        WHERE patente = v_patente;

        IF v_vehiculo_exists = 0 THEN
            /* INSERT NEW VEHICLE */
            INSERT INTO Vehiculos (
                patente,
                marca,
                modelo,
                color,
                anio,
                creado_en
            ) VALUES (
                v_patente,
                v_marca,
                v_modelo,
                v_color,
                v_anio,
                NOW()
            );
        ELSE
            /* UPDATE EXISTING VEHICLE */
            UPDATE Vehiculos 
            SET marca = v_marca,
                modelo = v_modelo,
                color = v_color,
                anio = v_anio,
                actualizado_en = NOW()
            WHERE patente = v_patente;
        END IF;

        /* LINK VEHICLE TO OT - Using existing OT_Vehiculos table */
        INSERT 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 correctamente ID: ', p_id_ot, ' Vehiculos: ', v_len);

END main_block$$

DELIMITER ;
