-- Seed Core Pack with Generic Timer Triggers, Sensors, and Basic Actions
-- This script creates the core pack with the new trigger/sensor architecture

SET search_path TO attune, public;

-- Insert core pack
INSERT INTO attune.pack (ref, label, description, version)
VALUES (
    'core',
    'Core Pack',
    'Built-in core functionality including timer triggers and basic actions',
    '1.0.0'
)
ON CONFLICT (ref) DO UPDATE SET
    label = EXCLUDED.label,
    description = EXCLUDED.description,
    version = EXCLUDED.version,
    updated = NOW();

-- Get pack ID for reference
DO $$
DECLARE
    v_pack_id BIGINT;
    v_action_runtime_id BIGINT;
    v_sensor_runtime_id BIGINT;
    v_intervaltimer_id BIGINT;
    v_crontimer_id BIGINT;
    v_datetimetimer_id BIGINT;
    v_echo_action_id BIGINT;
    v_sensor_10s_id BIGINT;
BEGIN
    -- Get core pack ID
    SELECT id INTO v_pack_id FROM attune.pack WHERE ref = 'core';

    -- Create shell runtime for actions
    INSERT INTO attune.runtime (ref, pack, pack_ref, name, description, runtime_type, distributions)
    VALUES (
        'core.action.shell',
        v_pack_id,
        'core',
        'shell',
        'Execute shell commands',
        'action',
        '{"shell": {"command": "sh"}}'::jsonb
    )
    ON CONFLICT (ref) DO UPDATE SET
        name = EXCLUDED.name,
        description = EXCLUDED.description,
        updated = NOW()
    RETURNING id INTO v_action_runtime_id;

    -- Create built-in runtime for sensors
    INSERT INTO attune.runtime (ref, pack, pack_ref, name, description, runtime_type, distributions)
    VALUES (
        'core.sensor.builtin',
        v_pack_id,
        'core',
        'Built-in',
        'Built-in runtime for system timers and sensors',
        'sensor',
        '[]'::jsonb
    )
    ON CONFLICT (ref) DO UPDATE SET
        name = EXCLUDED.name,
        description = EXCLUDED.description,
        updated = NOW()
    RETURNING id INTO v_sensor_runtime_id;

    -- Create generic timer triggers (these define trigger types, not instances)

    -- Interval Timer Trigger Type
    INSERT INTO attune.trigger (
        ref,
        pack,
        pack_ref,
        label,
        description,
        enabled,
        param_schema,
        out_schema
    )
    VALUES (
        'core.intervaltimer',
        v_pack_id,
        'core',
        'Interval Timer',
        'Fires at regular intervals based on specified time unit and interval',
        true,
        '{
            "type": "object",
            "properties": {
                "unit": {
                    "type": "string",
                    "enum": ["seconds", "minutes", "hours"],
                    "description": "Time unit for the interval"
                },
                "interval": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Number of time units between each trigger"
                }
            },
            "required": ["unit", "interval"]
        }'::jsonb,
        '{
            "type": "object",
            "properties": {
                "type": {"type": "string", "const": "interval"},
                "interval_seconds": {"type": "integer"},
                "fired_at": {"type": "string", "format": "date-time"}
            }
        }'::jsonb
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        param_schema = EXCLUDED.param_schema,
        out_schema = EXCLUDED.out_schema,
        updated = NOW()
    RETURNING id INTO v_intervaltimer_id;

    -- Cron Timer Trigger Type
    INSERT INTO attune.trigger (
        ref,
        pack,
        pack_ref,
        label,
        description,
        enabled,
        param_schema,
        out_schema
    )
    VALUES (
        'core.crontimer',
        v_pack_id,
        'core',
        'Cron Timer',
        'Fires based on a cron schedule expression',
        true,
        '{
            "type": "object",
            "properties": {
                "expression": {
                    "type": "string",
                    "description": "Cron expression (e.g., \"0 0 * * * *\" for every hour)"
                }
            },
            "required": ["expression"]
        }'::jsonb,
        '{
            "type": "object",
            "properties": {
                "type": {"type": "string", "const": "cron"},
                "fired_at": {"type": "string", "format": "date-time"},
                "scheduled_at": {"type": "string", "format": "date-time"}
            }
        }'::jsonb
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        param_schema = EXCLUDED.param_schema,
        out_schema = EXCLUDED.out_schema,
        updated = NOW()
    RETURNING id INTO v_crontimer_id;

    -- Datetime Timer Trigger Type
    INSERT INTO attune.trigger (
        ref,
        pack,
        pack_ref,
        label,
        description,
        enabled,
        param_schema,
        out_schema
    )
    VALUES (
        'core.datetimetimer',
        v_pack_id,
        'core',
        'Datetime Timer',
        'Fires once at a specific date and time',
        true,
        '{
            "type": "object",
            "properties": {
                "fire_at": {
                    "type": "string",
                    "format": "date-time",
                    "description": "ISO 8601 timestamp when the timer should fire"
                }
            },
            "required": ["fire_at"]
        }'::jsonb,
        '{
            "type": "object",
            "properties": {
                "type": {"type": "string", "const": "one_shot"},
                "fire_at": {"type": "string", "format": "date-time"},
                "fired_at": {"type": "string", "format": "date-time"}
            }
        }'::jsonb
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        param_schema = EXCLUDED.param_schema,
        out_schema = EXCLUDED.out_schema,
        updated = NOW()
    RETURNING id INTO v_datetimetimer_id;

    -- Create actions

    -- Echo action
    INSERT INTO attune.action (
        ref,
        pack,
        pack_ref,
        label,
        description,
        entrypoint,
        runtime,
        param_schema,
        out_schema
    )
    VALUES (
        'core.echo',
        v_pack_id,
        'core',
        'Echo',
        'Echo a message to stdout',
        'echo "${message}"',
        v_action_runtime_id,
        jsonb_build_object(
            'type', 'object',
            'properties', jsonb_build_object(
                'message', jsonb_build_object(
                    'type', 'string',
                    'description', 'Message to echo',
                    'default', 'Hello World'
                )
            ),
            'required', jsonb_build_array('message')
        ),
        jsonb_build_object(
            'type', 'object',
            'properties', jsonb_build_object(
                'stdout', jsonb_build_object('type', 'string'),
                'stderr', jsonb_build_object('type', 'string'),
                'exit_code', jsonb_build_object('type', 'integer')
            )
        )
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        entrypoint = EXCLUDED.entrypoint,
        param_schema = EXCLUDED.param_schema,
        out_schema = EXCLUDED.out_schema,
        updated = NOW()
    RETURNING id INTO v_echo_action_id;

    -- Sleep action
    INSERT INTO attune.action (
        ref,
        pack,
        pack_ref,
        label,
        description,
        entrypoint,
        runtime,
        param_schema,
        out_schema
    )
    VALUES (
        'core.sleep',
        v_pack_id,
        'core',
        'Sleep',
        'Sleep for a specified number of seconds',
        'sleep ${seconds}',
        v_action_runtime_id,
        jsonb_build_object(
            'type', 'object',
            'properties', jsonb_build_object(
                'seconds', jsonb_build_object(
                    'type', 'integer',
                    'description', 'Number of seconds to sleep',
                    'default', 1,
                    'minimum', 0
                )
            ),
            'required', jsonb_build_array('seconds')
        ),
        jsonb_build_object(
            'type', 'object',
            'properties', jsonb_build_object(
                'exit_code', jsonb_build_object('type', 'integer')
            )
        )
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        entrypoint = EXCLUDED.entrypoint,
        param_schema = EXCLUDED.param_schema,
        out_schema = EXCLUDED.out_schema,
        updated = NOW();

    -- Noop (no operation) action
    INSERT INTO attune.action (
        ref,
        pack,
        pack_ref,
        label,
        description,
        entrypoint,
        runtime,
        param_schema,
        out_schema
    )
    VALUES (
        'core.noop',
        v_pack_id,
        'core',
        'No Operation',
        'Does nothing - useful for testing',
        'exit 0',
        v_action_runtime_id,
        jsonb_build_object(
            'type', 'object',
            'properties', jsonb_build_object()
        ),
        jsonb_build_object(
            'type', 'object',
            'properties', jsonb_build_object(
                'exit_code', jsonb_build_object('type', 'integer')
            )
        )
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        entrypoint = EXCLUDED.entrypoint,
        param_schema = EXCLUDED.param_schema,
        out_schema = EXCLUDED.out_schema,
        updated = NOW();

    -- Create example sensor: 10-second interval timer
    INSERT INTO attune.sensor (
        ref,
        pack,
        pack_ref,
        label,
        description,
        entrypoint,
        runtime,
        runtime_ref,
        trigger,
        trigger_ref,
        enabled,
        config
    )
    VALUES (
        'core.timer_10s_sensor',
        v_pack_id,
        'core',
        '10 Second Timer Sensor',
        'Timer sensor that fires every 10 seconds',
        'builtin:interval_timer',
        v_sensor_runtime_id,
        'core.sensor.builtin',
        v_intervaltimer_id,
        'core.intervaltimer',
        true,
        '{"unit": "seconds", "interval": 10}'::jsonb
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        config = EXCLUDED.config,
        updated = NOW()
    RETURNING id INTO v_sensor_10s_id;

    -- Create example rule: 10-second timer triggers echo action with "hello, world"
    INSERT INTO attune.rule (
        ref,
        pack,
        pack_ref,
        label,
        description,
        action,
        action_ref,
        trigger,
        trigger_ref,
        conditions,
        action_params,
        enabled
    )
    VALUES (
        'core.rule.timer_10s_echo',
        v_pack_id,
        'core',
        'Echo Hello World Every 10 Seconds',
        'Example rule that echoes "hello, world" every 10 seconds',
        v_echo_action_id,
        'core.echo',
        v_intervaltimer_id,
        'core.intervaltimer',
        jsonb_build_object(),  -- No conditions
        jsonb_build_object(
            'message', 'hello, world'
        ),
        true
    )
    ON CONFLICT (ref) DO UPDATE SET
        label = EXCLUDED.label,
        description = EXCLUDED.description,
        action_params = EXCLUDED.action_params,
        updated = NOW();

    RAISE NOTICE 'Core pack seeded successfully';
    RAISE NOTICE 'Pack ID: %', v_pack_id;
    RAISE NOTICE 'Action Runtime ID: %', v_action_runtime_id;
    RAISE NOTICE 'Sensor Runtime ID: %', v_sensor_runtime_id;
    RAISE NOTICE 'Trigger Types: intervaltimer=%, crontimer=%, datetimetimer=%', v_intervaltimer_id, v_crontimer_id, v_datetimetimer_id;
    RAISE NOTICE 'Actions: core.echo, core.sleep, core.noop';
    RAISE NOTICE 'Sensors: core.timer_10s_sensor (id=%)', v_sensor_10s_id;
    RAISE NOTICE 'Rules: core.rule.timer_10s_echo';
END $$;
