-- ============================================================================
-- STORED PROCEDURE: prc_api_create_OT
-- Purpose: Create OT - Core database operations
-- Version: 2.2 (Compacted)
-- ============================================================================

DELIMITER $$

DROP PROCEDURE IF EXISTS `prc_api_create_OT`$$

CREATE PROCEDURE `prc_api_create_OT`(
    IN p_rut_cliente VARCHAR(12),
    IN p_nombre_cliente VARCHAR(255),
    IN p_direccion VARCHAR(255),
    IN p_comuna VARCHAR(100),
    IN p_telefono VARCHAR(20),
    IN p_email VARCHAR(255),
    IN p_rut_tecnico VARCHAR(12),
    IN p_presGPS VARCHAR(50),
    IN p_tiposerv VARCHAR(50),
    IN p_taller_install VARCHAR(50),
    IN p_vehiculos_json TEXT,
    OUT p_id_ot INT,
    OUT p_resultado VARCHAR(1),
    OUT p_mensaje VARCHAR(500)
)
main_block: BEGIN
    DECLARE v_cliente_exists INT DEFAULT 0;
    DECLARE v_empresa VARCHAR(100);
    DECLARE v_logo_servicio VARCHAR(255);
    DECLARE v_taller VARCHAR(256);
    DECLARE v_logo_taller VARCHAR(255);
    DECLARE v_motivo VARCHAR(100);
    DECLARE v_vehiculo_count INT DEFAULT 0;
    DECLARE v_vehiculo_index 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_json JSON;
    
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET p_resultado = 'F';
        SET p_mensaje = CONCAT('Error SQL: ', SQLSTATE);
        SET p_id_ot = NULL;
    END;
    
    -- GPS Provider Mapping
    CASE p_presGPS
        WHEN 'gpsimple' THEN SET v_empresa='gpsimple', v_logo_servicio='https://media.recuperauto.cl/Media/Cartec/gpsimple-logo.png';
        WHEN 'entel' THEN SET v_empresa='entel', v_logo_servicio='https://media.recuperauto.cl/Media/Cartec/follow-logo.png';
        WHEN 'tattersall' THEN SET v_empresa='tattersall', v_logo_servicio='https://media.recuperauto.cl/Media/Cartec/tattersall.png';
        WHEN 'cemin' THEN SET v_empresa='cemin', v_logo_servicio='https://media.recuperauto.cl/Media/Cartec/cemin.png';
        WHEN 'carflex' THEN SET v_empresa='carflex', v_logo_servicio='https://media.recuperauto.cl/Media/Cartec/carflex.png';
        ELSE SET v_empresa='gpsimple', v_logo_servicio='https://media.recuperauto.cl/Media/Cartec/gpsimple-logo.png';
    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', v_logo_taller='https://media.recuperauto.cl/Media/Cartec/cartec-logo.png';
        WHEN 'servitattersall' THEN SET v_taller='servitattersall', v_logo_taller='https://media.recuperauto.cl/Media/Cartec/servitattersall-logo.svg';
        ELSE SET v_taller='domicilio', v_logo_taller='https://media.recuperauto.cl/Media/Cartec/cartec-logo.png';
    END CASE;
    
    -- Validate JSON
    IF JSON_VALID(p_vehiculos_json)=0 THEN
        SET p_resultado='F', p_mensaje='Formato JSON de vehículos inválido';
        LEAVE main_block;
    END IF;
    
    SET v_vehiculo_count=JSON_LENGTH(p_vehiculos_json);
    IF v_vehiculo_count=0 THEN
        SET p_resultado='F', p_mensaje='Debe incluir al menos un vehículo';
        LEAVE main_block;
    END IF;
    
    START TRANSACTION;
    
    -- Upsert Client
    SELECT COUNT(*) INTO v_cliente_exists FROM Clientes WHERE rut_cliente=p_rut_cliente;
    IF v_cliente_exists=0 THEN
        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());
    ELSE
        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;
    END IF;
    
    -- Create OT
    INSERT INTO OT(rut_cliente,rut_tecnico,direccion_instalacion,comuna_instalacion,
                   telefono_instalacion,email_instalacion,estado_ot,empresa,taller,
                   motivo,logo_taller,logo_servicio,creado_en,actualizado_en)
    VALUES(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,NOW(),NOW());
    
    SET p_id_ot=LAST_INSERT_ID();
    
    -- Process Vehicles
    WHILE v_vehiculo_index<v_vehiculo_count DO
        SET v_vehiculo_json=JSON_EXTRACT(p_vehiculos_json,CONCAT('$[',v_vehiculo_index,']'));
        SET v_patente=UPPER(TRIM(JSON_UNQUOTE(JSON_EXTRACT(v_vehiculo_json,'$.patente')))),
            v_marca=TRIM(JSON_UNQUOTE(JSON_EXTRACT(v_vehiculo_json,'$.marca'))),
            v_modelo=TRIM(JSON_UNQUOTE(JSON_EXTRACT(v_vehiculo_json,'$.modelo'))),
            v_color=TRIM(JSON_UNQUOTE(JSON_EXTRACT(v_vehiculo_json,'$.color'))),
            v_anio=CAST(JSON_UNQUOTE(JSON_EXTRACT(v_vehiculo_json,'$.anio')) AS CHAR);
        
        IF v_color IS NULL OR v_color='' THEN SET v_color='NO INFORMADO'; END IF;
        
        INSERT IGNORE INTO Vehiculos(patente,marca,modelo,color,anio,creado_en)
        VALUES(v_patente,v_marca,v_modelo,v_color,v_anio,NOW());
        
        INSERT INTO OT_Vehiculos(id_ot,patente) VALUES(p_id_ot,v_patente);
        
        SET v_vehiculo_index=v_vehiculo_index+1;
    END WHILE;
    
    COMMIT;
    
    SET p_resultado='T', p_mensaje=CONCAT('OT creada exitosamente. ID: ',p_id_ot,'. Vehículos procesados: ',v_vehiculo_count);
    
END main_block$$

DELIMITER ;
