package com.izouma.nineth.service;

import com.izouma.nineth.domain.SysConfig;
import com.izouma.nineth.dto.PageQuery;
import com.izouma.nineth.enums.SearchMode;
import com.izouma.nineth.exception.BusinessException;
import com.izouma.nineth.repo.SysConfigRepo;
import com.izouma.nineth.utils.JpaUtils;
import lombok.AllArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

@Service
@AllArgsConstructor
public class SysConfigService {
    private SysConfigRepo sysConfigRepo;

    public Page<SysConfig> all(PageQuery pageQuery) {
        return sysConfigRepo.findAll(JpaUtils.toSpecification(pageQuery, SysConfig.class), JpaUtils.toPageRequest(pageQuery));
    }

    public BigDecimal getBigDecimal(String name) {
        return sysConfigRepo.findByName(name).map(sysConfig -> new BigDecimal(sysConfig.getValue()))
                .orElse(BigDecimal.ZERO);
    }

    public LocalTime getTime(String name) {
        String str = sysConfigRepo.findByName(name).map(SysConfig::getValue)
                .orElseThrow(new BusinessException("配置不存在"));
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm");
        return LocalTime.from(dateTimeFormatter.parse(str));
    }

    public boolean getBoolean(String name) {
        String str = sysConfigRepo.findByName(name).map(SysConfig::getValue)
                .orElseThrow(new BusinessException("配置不存在"));
        return str.equals("1");
    }

    public int getInt(String name) {
        String str = sysConfigRepo.findByName(name).map(SysConfig::getValue)
                .orElseThrow(new BusinessException("配置不存在"));
        return Integer.parseInt(str);
    }

    public String getString(String name) {
        return sysConfigRepo.findByName(name).map(SysConfig::getValue).orElse(null);
    }

    @PostConstruct
    public void init() {
        List<SysConfig> list = sysConfigRepo.findAll();
        if (list.stream().noneMatch(i -> i.getName().equals("search_mode"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("gift_gas_fee")
                    .desc("转赠gas费")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("1")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_wx_pub"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_wx_pub")
                    .desc("使用公众号支付")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("FALSE")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_wx_lite"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_wx_lite")
                    .desc("使用小程序支付")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("FALSE")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("hold_days"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("hold_days")
                    .desc("持有满几天可销售")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("1")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("default_search_mode"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("default_search_mode")
                    .desc("默认搜索方式")
                    .type(SysConfig.ValueType.STRING)
                    .value("FULL")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_sand_quick"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_sand_quick")
                    .desc("使用衫德h5快捷支付")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("FALSE")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("order_cancel_time"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("order_cancel_time")
                    .desc("订单自动取消间隔(S)")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("210")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("pay_channel"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("pay_channel")
                    .desc("支付通道")
                    .type(SysConfig.ValueType.SELECT)
                    .value("sandPay")
                    .options("hmPay,sandPay")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("gift_days"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("gift_days")
                    .desc("转赠满多少天可销售")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("20")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("min_recharge_amount"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("min_recharge_amount")
                    .desc("最小充值金额")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("100")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("max_recharge_amount"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("max_recharge_amount")
                    .desc("最大充值金额")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("5000")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_balance_pay"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_balance_pay")
                    .desc("使用余额支付")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("min_withdraw_amount"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("min_withdraw_amount")
                    .desc("最小提现金额")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("100")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("withdraw_charge"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("withdraw_charge")
                    .desc("提现手续费(%,最低)")
                    .type(SysConfig.ValueType.STRING)
                    .value("8,2")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_withdraw"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_withdraw")
                    .desc("允许提现")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_recharge"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_recharge")
                    .desc("允许充值")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("daily_withdraw_limit"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("daily_withdraw_limit")
                    .desc("每日提现次数限制")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("1")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_wallet"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_wallet")
                    .desc("开启钱包功能")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("realtime_settle_order"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("realtime_settle_order")
                    .desc("开启订单实时结算")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("wallet_enable_amount"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("wallet_enable_amount")
                    .desc("开启钱包所需最小消费金额")
                    .type(SysConfig.ValueType.NUMBER)
                    .value("1")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_auto_withdraw"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_auto_withdraw")
                    .desc("开启自动提现")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_force_withdraw"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_force_withdraw")
                    .desc("开启强制提现")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("enable_face_auth"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("enable_face_auth")
                    .desc("使用支付宝人脸实名认证")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("0")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("withdraw_channel"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("withdraw_channel")
                    .desc("提现通道")
                    .type(SysConfig.ValueType.SELECT)
                    .value("sandPay")
                    .options("payEase,sandPay")
                    .build());
        }
        if (list.stream().noneMatch(i -> i.getName().equals("parallel_airdrop"))) {
            sysConfigRepo.save(SysConfig.builder()
                    .name("parallel_airdrop")
                    .desc("并发空投")
                    .type(SysConfig.ValueType.BOOLEAN)
                    .value("1")
                    .build());
        }
        SearchMode searchMode = SearchMode.valueOf(sysConfigRepo.findByName("default_search_mode").get().getValue());
        JpaUtils.setDefaultSearchMode(searchMode);

        OrderPayService.setPayChannel(sysConfigRepo.findByName("pay_channel").get().getValue());
    }
}
