package com.slodon.b2b2c.model.seller;

import com.slodon.b2b2c.core.constant.MediaStatusConst;
import com.slodon.b2b2c.core.constant.StoreCompanyShowConstant;
import com.slodon.b2b2c.core.exception.MallException;
import com.slodon.b2b2c.core.response.PagerInfo;
import com.slodon.b2b2c.core.util.AssertUtil;
import com.slodon.b2b2c.dao.read.system.SysMediaReadMapper;
import com.slodon.b2b2c.dao.write.system.SysMediaWriteMapper;
import com.slodon.b2b2c.seller.dto.MediaListAddDTO;
import com.slodon.b2b2c.seller.dto.MediaListUpdateDTO;
import com.slodon.b2b2c.seller.dto.StoreProfileListAddDTO;
import com.slodon.b2b2c.seller.dto.StoreProfileListUpdateDTO;
import com.slodon.b2b2c.seller.example.StoreProfileListExample;
import com.slodon.b2b2c.seller.pojo.StoreProfileList;
import com.slodon.b2b2c.seller.pojo.Vendor;
import com.slodon.b2b2c.system.example.SysMediaExample;
import com.slodon.b2b2c.system.pojo.Admin;
import com.slodon.b2b2c.system.pojo.SysMedia;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 多媒体管理的model
 */
@Component
@Slf4j
public class SellerMediaModel {

    @Resource
    private SysMediaReadMapper sysMediaReadMapper;
    @Resource
    private SysMediaWriteMapper sysMediaWriteMapper;

    /**
     * @param type         多媒体分类
     * @param fileTypeList 文件类型
     * @param startTime    开始时间
     * @param endTime      结束时间
     * @param storeId      店铺id
     * @return
     */
    public Integer mediaListPageCount(String type, ArrayList<String> fileTypeList, String startTime, String endTime, Long storeId, String name) {
        return sysMediaReadMapper.mediaListPageCount(type, fileTypeList, startTime, endTime, storeId, name);
    }

    /**
     * 列表分页
     *
     * @param type
     * @param fileTypeList
     * @param startTime
     * @param endTime
     * @param pager
     * @param storeId
     * @return
     */
    public List<SysMedia> getMediaListByPage(String type, ArrayList<String> fileTypeList, String startTime,
                                             String endTime, PagerInfo pager, Long storeId, String name) {
        List<SysMedia> list = null;
        if (pager != null) {
            list = sysMediaReadMapper.mediaListPage(type, fileTypeList, startTime, endTime, pager.getStart(), pager.getPageSize(), storeId, name);
        }
        return list;
    }


    /**
     * 编辑
     *
     * @param mediaListUpdateDTO 编辑入参
     * @param vendor
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Integer updateMediaList(MediaListUpdateDTO mediaListUpdateDTO, Vendor vendor) {
        //根据id查询到店铺简介图片表的这笔记录
        SysMedia sysMedia = getMediaInfo(mediaListUpdateDTO.getId());
        sysMedia.setName(mediaListUpdateDTO.getName());
        sysMedia.setPath(mediaListUpdateDTO.getPath());
        sysMedia.setType(mediaListUpdateDTO.getType());
        sysMedia.setFileType(mediaListUpdateDTO.getExtend());
        sysMedia.setUpdateId(vendor.getVendorId());
        sysMedia.setUpdateTime(new Date());
        int count = sysMediaWriteMapper.updateByPrimaryKey(sysMedia);
        if (count == 0) {
            throw new MallException("修改多媒体表失败，请重试");
        }
        return count;
    }

    /**
     * 根据id查询多媒体表的记录
     *
     * @param id
     * @return
     */
    public SysMedia getMediaInfo(Long id) {
        return sysMediaReadMapper.selectByPrimaryKey(id);
    }


    /**
     * 新增-seller
     *
     * @param mediaListAddDTO 新增入参
     * @param vendor
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Integer saveMedia(MediaListAddDTO mediaListAddDTO, Vendor vendor) {
        //多媒体名称是否重复
        SysMediaExample example = new SysMediaExample();
        example.createCriteria().andNameEqualTo(mediaListAddDTO.getName()).andStatusEqualTo(MediaStatusConst.MEDIA_NORMAL).andCreateIdEqualTo(vendor.getVendorId());
        List<SysMedia> list = sysMediaReadMapper.selectByExample(example);
        AssertUtil.isTrue(!CollectionUtils.isEmpty(list), "多媒体名称已存在，请重新上传时重命名");

        //新增入库
        SysMedia sysMedia = new SysMedia();
        sysMedia.setStoreId(vendor.getStoreId());
        sysMedia.setName(mediaListAddDTO.getName());
        sysMedia.setPath(mediaListAddDTO.getPath());
        sysMedia.setType(mediaListAddDTO.getType());
        sysMedia.setFileType(mediaListAddDTO.getExtend());
        sysMedia.setCreateId(vendor.getVendorId());
        sysMedia.setCreateTime(new Date());
        sysMedia.setStatus(MediaStatusConst.MEDIA_NORMAL);
        int count = sysMediaWriteMapper.insert(sysMedia);
        if (count == 0) {
            throw new MallException("新增多媒体失败，请重试");
        }
        return count;
    }

    /**
     * 新增-admin
     *
     * @param mediaListAddDTO
     * @param admin
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Integer saveMedia1(MediaListAddDTO mediaListAddDTO, Admin admin) {
        //多媒体名称是否重复
        SysMediaExample example = new SysMediaExample();
        example.createCriteria().andNameEqualTo(mediaListAddDTO.getName()).andStatusEqualTo(MediaStatusConst.MEDIA_NORMAL);
        List<SysMedia> list = sysMediaReadMapper.selectByExample(example);
        AssertUtil.isTrue(!CollectionUtils.isEmpty(list), "多媒体名称已存在，请重新上传时重命名");

        //新增入库
        SysMedia sysMedia = new SysMedia();
//        sysMedia.setStoreId(admin.getStoreId());
        sysMedia.setName(mediaListAddDTO.getName());
        sysMedia.setPath(mediaListAddDTO.getPath());
        sysMedia.setType(mediaListAddDTO.getType());
        sysMedia.setFileType(mediaListAddDTO.getExtend());
//        sysMedia.setCreateId(admin.getAdminId());
        sysMedia.setCreateTime(new Date());
        sysMedia.setStatus(MediaStatusConst.MEDIA_NORMAL);
        int count = sysMediaWriteMapper.insert(sysMedia);
        if (count == 0) {
            throw new MallException("新增多媒体失败，请重试");
        }
        return count;
    }


    /**
     * 删除
     *
     * @param mediaIds 多媒体id字符串
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Integer deleteMediaByIds(String mediaIds) {
        String[] mediaArry = mediaIds.split(",");
        int count = sysMediaWriteMapper.deleteMediaByIds(mediaArry, MediaStatusConst.MEDIA_DELETE);
        if (count == 0) {
            throw new MallException("删除多媒体失败，请重试");
        }
        return count;
    }

    /**
     * 根据前台选择之后传回来的上传多媒体类型来设置数据库查的类型
     * @param fileType 前台选择之后传回来的上传多媒体类型 有 图片/视频/文件
     * @return
     */
    public ArrayList<String> getFileTypeList(String fileType){
        ArrayList<String> fileTypeList = new ArrayList<>();
        if("picture".equals(fileType)){
            fileTypeList.add(".jpg");
            fileTypeList.add(".jpeg");
            fileTypeList.add(".bmp");
            fileTypeList.add(".gif");
            fileTypeList.add(".png");
            fileTypeList.add(".tif");
        }else if("video".equals(fileType)){
            fileTypeList.add(".avi");
            fileTypeList.add(".mov");
            fileTypeList.add(".rmvb");
            fileTypeList.add(".rm");
            fileTypeList.add(".flv");
            fileTypeList.add(".mp4");
            fileTypeList.add(".3gp");
            fileTypeList.add("video");
        }else if("file".equals(fileType)){
            fileTypeList.add(".doc");
            fileTypeList.add(".docx");
            fileTypeList.add(".xls");
            fileTypeList.add(".xlsx");
            fileTypeList.add(".pdf");
            fileTypeList.add(".zip");
            fileTypeList.add(".rar");
        }
        return fileTypeList;
    }

    /**
     *
     * @param fileType
     * @param storeId
     * @return
     */
    public List<String> getMediaFileByFileType(String fileType, Long storeId) {
        SysMediaExample sysMediaExample = new SysMediaExample();
        SysMediaExample.Criteria criteria = sysMediaExample.createCriteria();
        criteria.andStoreIdEqualTo(storeId);
        List<String> fileTypeList = getFileTypeList(fileType);
        criteria.andFileTypeIn(fileTypeList);
        List<SysMedia> sysMediaList = sysMediaReadMapper.selectByExample(sysMediaExample);
        return sysMediaList.stream().map(SysMedia::getPath).collect(Collectors.toList());
    }
}
