// Copyright 2015-2024 Swim Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use std::{error::Error, time::Duration};

use agent::{ProducerAgent, ProducerLifecycle};
use swimos::{
    agent::agent_model::AgentModel,
    route::RoutePattern,
    server::{BoxServer, ServerBuilder},
};

mod agent;

pub async fn make_server() -> Result<BoxServer, Box<dyn Error + Send + Sync>> {
    let route = RoutePattern::parse_str("/producer/:name}")?;

    let lifecycle = ProducerLifecycle;
    let agent = AgentModel::new(ProducerAgent::default, lifecycle.into_lifecycle());

    let server = ServerBuilder::with_plane_name("Producer Plane")
        .add_route(route, agent)
        .update_config(|config| {
            config.agent_runtime.inactive_timeout = Duration::from_secs(5 * 60);
        })
        .build()
        .await?;

    Ok(server)
}
