package com.bizzan.bitrade.service;

import com.bizzan.bitrade.constant.CommonStatus;
import com.bizzan.bitrade.dao.CoinNetworkConfigDao;
import com.bizzan.bitrade.dao.CoinNetworkDao;
import com.bizzan.bitrade.entity.CoinNetwork;
import com.bizzan.bitrade.service.Base.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 主网信息 Service
 *
 * @author auto
 * @date 2026-05-13
 */
@Service
public class CoinNetworkService extends BaseService {

    @Autowired
    private CoinNetworkDao coinNetworkDao;

    @Autowired
    private CoinNetworkConfigDao coinNetworkConfigDao;

    /**
     * 查询所有启用的主网，按排序升序
     *
     * @return 主网列表
     */
    @Transactional(readOnly = true)
    public List<CoinNetwork> findAllEnabled() {
        return coinNetworkDao.findAllByStatusOrderBySortAsc(CommonStatus.NORMAL);
    }

    /**
     * 查询所有主网（含禁用），用于管理端
     *
     * @return 主网列表
     */
    @Transactional(readOnly = true)
    public List<CoinNetwork> findAll() {
        return coinNetworkDao.findAllByOrderBySortAsc();
    }

    /**
     * 按ID查询主网
     *
     * @param id 主网ID
     * @return 主网信息，不存在返回 null
     */
    @Transactional(readOnly = true)
    public CoinNetwork findById(Long id) {
        return coinNetworkDao.findOne(id);
    }

    /**
     * 按名称查询主网
     *
     * @param name 主网名称
     * @return 主网信息
     */
    @Transactional(readOnly = true)
    public CoinNetwork findByName(String name) {
        return coinNetworkDao.findByName(name);
    }

    /**
     * 新增主网
     *
     * @param coinNetwork 主网信息
     * @return 保存后的主网信息
     * @throws IllegalArgumentException 主网名称已存在时抛出
     */
    @Transactional(rollbackFor = Exception.class)
    public CoinNetwork save(CoinNetwork coinNetwork) {
        if (coinNetworkDao.existsByName(coinNetwork.getName())) {
            throw new IllegalArgumentException("主网名称已存在：" + coinNetwork.getName());
        }
        return coinNetworkDao.save(coinNetwork);
    }

    /**
     * 更新主网信息
     *
     * @param coinNetwork 主网信息（必须含有效ID）
     * @return 更新后的主网信息
     */
    @Transactional(rollbackFor = Exception.class)
    public CoinNetwork update(CoinNetwork coinNetwork) {
        return coinNetworkDao.save(coinNetwork);
    }

    /**
     * 更新主网状态
     *
     * @param id     主网ID
     * @param status 目标状态
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateStatus(Long id, CommonStatus status) {
        CoinNetwork network = coinNetworkDao.findOne(id);
        if (network != null) {
            network.setStatus(status);
            coinNetworkDao.save(network);
        }
    }

    /**
     * 删除主网及其关联的所有币种主网配置（coin_network_config）
     * 覆写父类 delete，使用本地注入的 dao 避免父类 dao 为 null 导致 NPE
     *
     * @param id 主网ID
     */
    @Transactional(rollbackFor = Exception.class)
    public void delete(long id) {
        // 先删除该主网下所有关联的币种主网配置
        coinNetworkConfigDao.deleteInBatch(coinNetworkConfigDao.findAllByNetworkId(id));
        // 再删除主网本身
        coinNetworkDao.delete(id);
    }
}
