/**
 * 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.
 */
package io.streamnative.pulsar.manager.dao;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.streamnative.pulsar.manager.entity.EnvironmentEntity;
import io.streamnative.pulsar.manager.entity.EnvironmentsRepository;
import io.streamnative.pulsar.manager.mapper.EnvironmentsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * EnvironmentsRepositoryImpl implements EnvironmentsRepository for change environment.
 */
@Repository
public class EnvironmentsRepositoryImpl implements EnvironmentsRepository {

    private final EnvironmentsMapper environmentsMapper;

    @Autowired
    public EnvironmentsRepositoryImpl(EnvironmentsMapper environmentsMapper) {
        this.environmentsMapper = environmentsMapper;
    }

    @Override
    public Optional<EnvironmentEntity> findByBroker(String broker) {
        return Optional.ofNullable(environmentsMapper.findByBroker(broker));
    }

    @Override
    public Optional<EnvironmentEntity> findByName(String name) {
        return Optional.ofNullable((environmentsMapper.findByName(name)));
    }

    @Override
    public void save(EnvironmentEntity environmentEntity) {
        environmentsMapper.insert(environmentEntity);
    }

    @Override
    public Page<EnvironmentEntity> getEnvironmentsList(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return environmentsMapper.findEnvironmentsList();
    }

    @Override
    public List<EnvironmentEntity> getAllEnvironments() {
        return environmentsMapper.findEnvironmentsList();
    }

    @Override
    public void remove(String name) {
        environmentsMapper.delete(name);
    }

    @Override
    public void update(EnvironmentEntity environmentEntity) {
        environmentsMapper.update(environmentEntity);
    }
}
