package jnpf.franchisee.controller.app;

import com.github.pagehelper.PageInfo;
import jnpf.base.ActionResult;
import jnpf.base.vo.PageListVO;
import jnpf.franchisee.service.FranchiseeService;
import jnpf.model.franchisee.req.FranchiseeAddReq;
import jnpf.model.franchisee.req.FranchiseeQueryReq;
import jnpf.model.franchisee.req.FranchiseeSimpleAddReq;
import jnpf.model.franchisee.req.FranchiseeUpdateReq;
import jnpf.model.franchisee.vo.FranchiseeIdName;
import jnpf.model.franchisee.vo.FranchiseePageVO;
import jnpf.model.franchisee.vo.FranchiseeStoreVO;
import jnpf.model.franchisee.vo.FranchiseeVO;
import jnpf.parameter.service.ParamService;
import jnpf.util.FtbUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * APP加盟商控制器
 */
@RestController
@Validated
@RequestMapping("/app/franchisee")
public class FranchiseeAppController {

    private static final String FRANCHISEE_CODE_PREFIX = "JSM";
    private static final String FRANCHISEE_CODE_SEQ_KEY = "franchiseeCodeSeq";
    private static final DateTimeFormatter FRANCHISEE_CODE_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");

    @Autowired
    private FranchiseeService franchiseeService;
    @Autowired
    private ParamService paramService;

    /**
     * 简单新增加盟商
     *
     * @param req 简单新增请求参数
     * @return 操作结果
     */
    @PostMapping("/simple-add")
    public ActionResult<Void> simpleAdd(@Validated @RequestBody FranchiseeSimpleAddReq req) {
        franchiseeService.add(req.convert());
        return ActionResult.success();
    }

    /**
     * 自动生成加盟商编码
     *
     * 规则：JSM + yyyyMMdd + 递增序号。
     * 递增序号通过固定key在数据库中维护，不按天重置。
     *
     * @return 加盟商编码
     */
    @GetMapping("/generate-code")
    public ActionResult<String> generateCode() {
        return ActionResult.success("success",franchiseeService.generateCode());
    }

    /**
     * 新增加盟商
     *
     * @param req 新增请求参数
     * @return 操作结果
     */
    @PostMapping("/add")
    public ActionResult<Void> add(@Validated @RequestBody FranchiseeAddReq req) {
        franchiseeService.add(req);
        return ActionResult.success();
    }

    /**
     * 编辑加盟商
     *
     * @param req 编辑请求参数
     * @return 操作结果
     */
    @PutMapping("/update")
    public ActionResult<Void> update(@Validated @RequestBody FranchiseeUpdateReq req) {
        franchiseeService.update(req);
        return ActionResult.success();
    }

    /**
     * 删除加盟商
     *
     * @param id 主键ID
     * @return 操作结果
     */
    @DeleteMapping("/delete/{id}")
    public ActionResult<Void> delete(@PathVariable("id") @NotBlank(message = "主键ID不能为空") String id) {
        franchiseeService.delete(id);
        return ActionResult.success();
    }

    /**
     * 查询加盟商详情
     *
     * @param id 主键ID
     * @return 加盟商详情
     */
    @GetMapping("/query-info/{id}")
    public ActionResult<FranchiseeVO> queryInfo(@PathVariable("id") @NotBlank(message = "主键ID不能为空") String id) {
        return ActionResult.success(franchiseeService.queryInfo(id));
    }

    /**
     * 分页查询加盟商列表
     *
     * @param req 查询参数
     * @return 分页结果
     */
    @GetMapping("/query-page")
    public ActionResult<PageListVO<FranchiseePageVO>> queryPage(@Valid FranchiseeQueryReq req) {
        PageInfo<FranchiseePageVO> pageInfo = franchiseeService.queryPage(req,true);
        return ActionResult.page(pageInfo.getList(), FtbUtil.getPagination(pageInfo));
    }

    /**
     * 根据关键字查询加盟商ID列表（模糊匹配加盟商名称）
     *
     * @param keyword 关键字（加盟商名称）
     * @return 加盟商ID列表
     */
    @GetMapping("/query-id-list")
    public ActionResult<List<FranchiseeIdName>> queryIdListByPrefix(@RequestParam(value = "keyword", required = false) String keyword) {
        return ActionResult.success(franchiseeService.queryIdListByPrefix(keyword));
    }

    /**
     * 根据加盟商ID查询其下门店列表
     *
     * @param franchiseeId 加盟商ID
     * @return 门店列表
     */
    @GetMapping("/query-store-list/{franchiseeId}")
    public ActionResult<List<FranchiseeStoreVO>> queryStoreList(@PathVariable("franchiseeId") @NotBlank(message = "加盟商ID不能为空") String franchiseeId) {
        return ActionResult.success(franchiseeService.queryStoreList(franchiseeId));
    }
}
