package com.gxwebsoft.shop.controller;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gxwebsoft.common.core.utils.RequestUtil;
import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.shop.entity.Merchant;
import com.gxwebsoft.shop.entity.MerchantAccount;
import com.gxwebsoft.shop.service.MerchantApplyService;
import com.gxwebsoft.shop.entity.MerchantApply;
import com.gxwebsoft.shop.param.MerchantApplyParam;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.core.web.BatchParam;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.shop.service.MerchantService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.List;

/**
 * 商户入驻申请控制器
 *
 * @author 科技小王子
 * @since 2024-04-05 01:24:36
 */
@Api(tags = "商户入驻申请管理")
@RestController
@RequestMapping("/api/shop/merchant-apply")
public class MerchantApplyController extends BaseController {
  @Resource
  private MerchantApplyService merchantApplyService;
  @Resource
  private MerchantService merchantService;
  @Resource
  private RequestUtil requestUtil;

  @ApiOperation("分页查询商户入驻申请")
  @GetMapping("/page")
  public ApiResult<PageResult<MerchantApply>> page(MerchantApplyParam param) {
    // 使用关联查询
    return success(merchantApplyService.pageRel(param));
  }

  @ApiOperation("查询全部商户入驻申请")
  @GetMapping()
  public ApiResult<List<MerchantApply>> list(MerchantApplyParam param) {
    // 使用关联查询
    return success(merchantApplyService.listRel(param));
  }

  @ApiOperation("根据id查询商户入驻申请")
  @GetMapping("/{id}")
  public ApiResult<MerchantApply> get(@PathVariable("id") Integer id) {
    // 使用关联查询
    return success(merchantApplyService.getByIdRel(id));
  }

  @ApiOperation("添加商户入驻申请")
  @PostMapping()
  public ApiResult<?> save(@RequestBody MerchantApply merchantApply) {
    // 记录当前登录用户id
    User loginUser = getLoginUser();
    if (loginUser != null) {
      merchantApply.setUserId(loginUser.getUserId());
    }
    if (merchantService.count(new LambdaQueryWrapper<Merchant>().eq(Merchant::getPhone, merchantApply.getPhone())) > 0) {
      return fail("该手机号码已存在");
    }
    if (merchantApplyService.count(new LambdaQueryWrapper<MerchantApply>().eq(MerchantApply::getPhone, merchantApply.getPhone())) > 0) {
      return fail("该手机号码已存在");
    }
    if (merchantApplyService.save(merchantApply)) {
      return success("添加成功");
    }
    return fail("添加失败");
  }

  @ApiOperation("修改商户入驻申请")
  @PutMapping()
  public ApiResult<?> update(@RequestBody MerchantApply merchantApply) {
    if (merchantApply.getStatus().equals(1)) {
      // TODO 审核通过则创建商户
      final Merchant one = merchantService.getOne(new LambdaQueryWrapper<Merchant>().eq(Merchant::getPhone, merchantApply.getPhone()).last("limit 1"));
      final MerchantAccount merchantAccount = new MerchantAccount();
      BeanUtils.copyProperties(merchantApply, merchantAccount);

      final User user = new User();

      if(ObjectUtil.isNotEmpty(one)){
        BeanUtils.copyProperties(merchantApply, one);
        one.setStatus(0);
        merchantService.updateById(one);
        user.setMerchantId(one.getMerchantId());
        user.setMerchantName(one.getMerchantName());
      }else {
        final Merchant merchant = new Merchant();
        BeanUtils.copyProperties(merchantApply, merchant);
        merchant.setStatus(0);
        merchantService.save(merchant);
        user.setMerchantId(merchant.getMerchantId());
        user.setMerchantName(merchant.getMerchantName());
      }
      // TODO 创建商户账号
      merchantAccount.setRealName(merchantApply.getRealName());
      requestUtil.saveUserByPhone(merchantAccount);
      // TODO 更新用户表的商户ID
      requestUtil.updateUserMerchantId(user);

    }
    // TODO 驳回

    if (merchantApplyService.updateById(merchantApply)) {
      return success("修改成功");
    }
    return fail("修改失败");
  }

  @ApiOperation("删除商户入驻申请")
  @DeleteMapping("/{id}")
  public ApiResult<?> remove(@PathVariable("id") Integer id) {
    if (merchantApplyService.removeById(id)) {
      return success("删除成功");
    }
    return fail("删除失败");
  }

  @ApiOperation("批量添加商户入驻申请")
  @PostMapping("/batch")
  public ApiResult<?> saveBatch(@RequestBody List<MerchantApply> list) {
    if (merchantApplyService.saveBatch(list)) {
      return success("添加成功");
    }
    return fail("添加失败");
  }

  @ApiOperation("批量修改商户入驻申请")
  @PutMapping("/batch")
  public ApiResult<?> removeBatch(@RequestBody BatchParam<MerchantApply> batchParam) {
    if (batchParam.update(merchantApplyService, "apply_id")) {
      return success("修改成功");
    }
    return fail("修改失败");
  }

  @ApiOperation("批量删除商户入驻申请")
  @DeleteMapping("/batch")
  public ApiResult<?> removeBatch(@RequestBody List<Integer> ids) {
    if (merchantApplyService.removeByIds(ids)) {
      return success("删除成功");
    }
    return fail("删除失败");
  }

}
