// Copyright 2022 RisingWave Labs
//
// 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::io::Write;

use anyhow::Result;

use crate::{ExecuteContext, RedisConfig, Task};

pub struct RedisReadyCheckTask {
    config: RedisConfig,
}

impl RedisReadyCheckTask {
    pub fn new(config: RedisConfig) -> Result<Self> {
        Ok(Self { config })
    }
}

impl Task for RedisReadyCheckTask {
    fn execute(&mut self, ctx: &mut ExecuteContext<impl Write>) -> Result<()> {
        ctx.pb.set_message("waiting for online...");
        let client = redis::Client::open(
            "redis://".to_owned() + &format!("{}:{}", self.config.address, self.config.port),
        )?;

        ctx.wait(|| {
            let _ = client.get_connection()?;
            Ok(())
        })?;

        ctx.complete_spin();
        Ok(())
    }
}
