package com.style24.scm.biz.dao;

import java.util.Collection;

import org.springframework.dao.DataAccessException;

import com.gagaframework.web.parameter.GagaMap;
import com.style24.core.support.annotation.ShopDs;
import com.style24.persistence.domain.Brand;
import com.style24.persistence.domain.FreeGoods;
import com.style24.persistence.domain.Goods;
import com.style24.persistence.domain.GoodsCategory;
import com.style24.persistence.domain.GoodsCompose;
import com.style24.persistence.domain.GoodsDesc;
import com.style24.persistence.domain.GoodsHst;
import com.style24.persistence.domain.GoodsImg;
import com.style24.persistence.domain.GoodsMass;
import com.style24.persistence.domain.GoodsNotiInfo;
import com.style24.persistence.domain.GoodsSafeNo;
import com.style24.persistence.domain.GoodsSearch;
import com.style24.persistence.domain.GoodsSupplyPrice;
import com.style24.persistence.domain.GoodsVideo;
import com.style24.persistence.domain.IfIncomelot;
import com.style24.persistence.domain.IfProductSku;
import com.style24.persistence.domain.Itemkind;
import com.style24.persistence.domain.NotiInfo;
import com.style24.persistence.domain.Notice;
import com.style24.persistence.domain.NoticeGoods;
import com.style24.persistence.domain.Option;
import com.style24.persistence.domain.WmsGoods;

/**
 * 상품 Dao
 *
 * @author gagamel
 * @since 2020. 10. 19
 */
@ShopDs
public interface TssGoodsDao {

	/**
	 * 품목 목록
	 * @param itemkind
	 * @return
	 * @author eskim
	 * @since 2021. 01. 12
	 */
	Collection<Itemkind> getItemkindList(Itemkind itemkind);

	/**
	 * 상품 목록 건수
	 *
	 * @param goodsSearch
	 * @return
	 * @author eskim
	 * @since 2010. 10. 20
	 */
	int getGoodsListCount(GoodsSearch goodsSearch);

	/**
	 * 상품 목록
	 *
	 * @param goodsSearch
	 * @return
	 * @author eskim
	 * @since 2010. 10. 20
	 */
	Collection<Goods> getGoodsList(GoodsSearch goodsSearch);

	/**
	 * 상품 목록 기본정보 엑셀다운로드
	 *
	 * @param goodsSearch
	 * @return
	 * @author eskim
	 * @since 2020. 10. 22
	 */
	Collection<GagaMap> getGoodsInfoExcelList(GoodsSearch goodsSearch);

	/**
	 * 상품 이미지 필수 항목 입력 여부 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2020. 10. 22
	 */
	Collection<Goods> getGoodsImgsYn(Goods goods);

	/**
	 * 상품 상세
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2020. 10. 22
	 */
	Goods getGoods(Goods goods);

	/**
	 * 상품 상세 정보 조회
	 *
	 * @param goodsVideo
	 * @return
	 * @author eskim
	 * @since 2020. 10. 22
	 */
	Collection<GoodsDesc> getGoodsDescList(GoodsDesc goodsDesc);

	/**
	 * 상품 정보 이력
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2019. 08. 12
	 */
	Collection<GoodsHst> getGoodsHstList(Goods goods);

	/**
	 * 상품 옵션 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2020. 10. 26
	 */
	Collection<Option> getGoodsSizeList(Goods goods);

	/**
	 * 상품 색상목록 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2020. 11. 18
	 */
	Collection<GoodsImg> getGoodsColorList(Goods goods);

	/**
	 * 상품 고시 조회
	 *
	 * @param goodsNotiInfo
	 * @return
	 * @author eskim
	 * @since 2020. 10. 12
	 */
	Collection<GoodsNotiInfo> getGoodsNotiInfoList(GoodsNotiInfo goodsNotiInfo);

	/**
	 * 상품의 정보고시 항목 목록
	 *
	 * @param notiInfo
	 * @return
	 * @author eskim
	 * @since 2020. 10. 18
	 */
	Collection<NotiInfo> getNotiGoodsInfoList(NotiInfo notiInfo);

	/**
	 * 상품 기본 정보 이력 생성
	 *
	 * @param goods
	 * @author eskim
	 * @since 2020. 10. 22
	 */
	void createGoodsHst(Goods goods);

	/**
	 * 상품 수정 항목 일괄변경
	 *
	 * @param goods
	 * @author eskim
	 * @since 2020. 10. 22
	 */
	void updateGoodsState(Goods goods);

	/**
	 * 상품 자동 검색어 조회
	 *
	 * @param goodsCd
	 * @return
	 * @author eskim
	 * @since 2020. 10. 23
	 */
	String getGoodsSnm(String goodsCd);

	/**
	 * 상품검색어 수정
	 *
	 * @param goods
	 * @author eskim
	 * @since 2020. 10. 23
	 */
	void updateGoodsSnm(Goods goods);

	/**
	 * 상품 기본 정보 수정
	 *
	 * @param goods
	 * @author eskim
	 * @since 2020. 10. 27
	 */
	void updateGoods(Goods goods);

	/**
	 * 상품 상세정보 삭제
	 *
	 * @param godsDesc
	 * @author eskim
	 * @since 2020. 10. 27
	 */
	void deleteGoodsDesc(GoodsDesc godsDesc);

	/**
	 * 상품 상세 정보 이력 생성
	 * @param createGoodsDetailDesc
	 * @author eskim
	 * @since 2021. 01. 04
	 */
	public void createGoodsDetailDescHst(GoodsDesc godsDesc);

	/**
	 * 상품 상세정보 등록
	 *
	 * @param godsDesc
	 * @author eskim
	 * @since 2020. 10. 27
	 */
	void createGoodsDesc(GoodsDesc godsDesc);

	/**
	 * 상품 옵션/재고 정보 이력생성
	 *
	 * @param option
	 * @author eskim
	 * @since 2020. 10. 27
	 */
	void createStockHst(Option option);

	/**
	 * 상품 옵션/재고 정보 수정
	 *
	 * @param stock
	 * @author eskim
	 * @since 2020. 10. 27
	 */
	void saveStock(Option option);

	/**
	 * 상품 기본 정보 등록
	 *
	 * @param goods
	 * @author eskim
	 * @since 2020. 10. 30
	 */
	void createGoods(Goods goods);

	/**
	 * 상품 품목변경 고시정보 삭제
	 *
	 * @param goods
	 * @author eskim
	 * @since 2020. 10. 23
	 */
	void deleteGoodsNotiInfo(Goods goods);

	/**
	 * 상품 고시 정보 수정
	 *
	 * @param goodsNotiInfo
	 * @author eskim
	 * @since 2020. 10. 23
	 */
	void saveGoodsNotiInfo(GoodsNotiInfo goodsNotiInfo);

	/**
	 * 입점 상품 가격 변경
	 *
	 * @param supplyGoodsPrice
	 * @return void
	 * @author eskim
	 * @since 2020. 11. 13
	 */
	void createGoodSupplyPrice(GoodsSupplyPrice supplyGoodsPrice);

	/**
	 * 상품 옵션 존재여부 확인
	 *
	 * @param option
	 * @return
	 * @author eskim
	 * @since 2020. 11. 17
	 */
	int getGoodsOptionCount(Option option);

	/**
	 * 상품 가격 승인 목록 건수
	 *
	 * @param goodsPriceHst
	 * @return
	 * @author eskim
	 * @since 2020. 11. 26
	 */
	int getGoodsSupplyPriceCount(GoodsSupplyPrice goodsSupplyPrice);

	/**
	 * 상품 가격 승인 목록
	 *
	 * @param goodsPriceHst
	 * @return
	 * @author eskim
	 * @since 2020. 11. 26
	 */
	Collection<GoodsSupplyPrice> getGoodsSupplyPriceList(GoodsSupplyPrice goodsSupplyPrice);

	/**
	 * 상품 상세공지 목록
	 *
	 * @param goodsSearch
	 * @return
	 * @author eskim
	 * @since 2020. 11. 27
	 */
	Collection<Notice> getNoticeList(GoodsSearch goodsSearch);

	/**
	 * 상품 상세공지 상품 목록
	 *
	 * @param goodsSearch
	 * @return
	 * @author eskim
	 * @since 2020. 11. 27
	 */
	Collection<NoticeGoods> getNoticeGoodsList(Notice notice);

	/**
	 * 상품 상세공지 상품 저장
	 *
	 * @param noticeGoods
	 * @return
	 * @author eskim
	 * @since 2020. 11. 27
	 */
	void saveNoticeGoods(NoticeGoods noticeGoods);

	/**
	 * 상품 상세공지 상품 삭제
	 *
	 * @param noticeGoods
	 * @return
	 * @author eskim
	 * @since 2020. 11. 27
	 */
	void deleteNoticeGoods(NoticeGoods noticeGoods);

	/**
	 * 상품 구매등급 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2020. 12. 11
	 */
	Collection<Goods> getGoodsDetailOrderGradeList(Goods goods);

	/**
	 * 상품 구매등급 삭제
	 *
	 * @param map
	 * @return
	 * @author eskim
	 * @since 2020. 12. 11
	 */
	void deleteGoodsCustGrade(Goods goods);

	/**
	 * 상품 구매등급 저장
	 *
	 * @param map
	 * @return
	 * @author eskim
	 * @since 2020. 12. 11
	 */
	void createGoodsCustGrade(Goods goods);

	/**
	 * 상품이미지 목록
	 *
	 * @param goodsImg
	 * @return Collection<GoodsImg>
	 * @author eskim
	 * @since 2020. 12. 23
	 */
	Collection<GoodsImg> getGoodsImageList(GoodsImg goodsImg);

	/**
	 * 상품이미지 전체 삭제
	 * @param goodsImg - 상품이미지 정보
	 * @throws DataAccessException
	 * @author eskim
	 * @since 2020. 12. 23
	 */
	public void deleteGoodsImageTotal(GoodsImg goodsImg);

	/**
	 * 상품이미지 삭제
	 * @param goodsImg - 상품이미지 정보
	 * @throws DataAccessException
	 * @author eskim
	 * @since 2020. 12. 23
	 */
	public void deleteGoodsImage(GoodsImg goodsImg);

	/**
	 * 상품이미지 등록
	 * @param goodsImg - 상품이미지 정보
	 * @throws DataAccessException
	 * @author eskim
	 * @since 2020. 12. 23
	 */
	public void createGoodsImage(GoodsImg goodsImg);

	/**
	 * 상품이미지 네이밍순 조회
	 * @param goodsImg - 상품이미지 정보
	 * @throws DataAccessException
	 * @author eskim
	 * @since 2021. 08. 29
	 */
	public Collection<GoodsImg> getGoodsImageNewDispOrdList(GoodsImg goodsImg);

	/**
	 * 상품이미지 순서변경
	 * @param goodsImg - 상품이미지 정보
	 * @throws DataAccessException
	 * @author eskim
	 * @since 2021. 08. 29
	 */
	public void updateGoodsImageDispOrd(GoodsImg goodsImg);

	/**
	 * 상품기본이미지명 조회
	 * @param goodsImg - 상품이미지 정보
	 * @throws
	 * @author eskim
	 * @since 2021. 07. 25
	 */
	public String getGoodsDefaultImageName(GoodsImg goodsImg);

	/**
	 * wms 상품정보 조회
	 *
	 * @param goodsMass
	 * @return
	 * @author eskim
	 * @since 2021. 01. 12
	 */
	WmsGoods getWmsGoodsInfo(Goods goods);

	/**
	 * 상품통계 생성
	 *
	 * @param goods
	 * @author eskim
	 * @since 2021. 01. 12
	 */
	void createGoodsSmmary(Goods goods);

	/**
	 *  WMS 입고상품 사은품 상품 구분 저장
	 * @param wmsGoods
	 * @author eskim
	 * @since 2021. 01. 12
	 */
	public void saveGoodsWmsIncomelot(WmsGoods wmsGoods);

	/**
	 * 품목 별 고시기본정보 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2021. 01. 12
	 */
	Collection<GoodsNotiInfo> getItemkindNotiInfoList(Goods goods);

	/**
	 * 상품 등록 로그 생성
	 *
	 * @param goodsMass
	 * @author eskim
	 * @since 2021. 01. 12
	 */
	void createGoodsRegLog(GoodsMass goodsMass);

	/**
	 * 상품 품목별 매핑 카테고리 삭제
	 *
	 * @param goods
	 * @author eskim
	 * @since 2021. 09. 29
	 */
	void deleteGoodsCategory(GoodsCategory goodsCategory);


	/**
	 * 상품 품목별 매핑 카테고리 저장
	 *
	 * @param goods
	 * @author eskim
	 * @since 2021. 01. 12
	 */
	void createCategoryGoods(Goods goods);

	/**
	 * wms 상품 색상 , 사이즈별 재고 정보 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2021. 01. 13
	 */
	Collection<Option> getGoodsWmsSizeList(Goods goods);

	/**
	 * 상품등록로그 목록
	 *
	 * @param goodsSearch
	 * @return
	 * @author eskim
	 * @since 2021. 01. 13
	 */
	Collection<GoodsMass> getGoodsRegLogList(GoodsSearch goodsSearch);

	/**
	 * 상품 색상, 사이즈 정보 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2021. 01. 14
	 */
	GoodsMass getGoodsColorSize(Goods goods);

	/**
	 * 상품 대표색상 설정
	 *
	 * @param goodsMass
	 * @return
	 * @author eskim
	 * @since 2021. 01. 14
	 */
	void updateGoodsMainColorCd(GoodsMass goodsMass);

	/**
	 * 상품 상태만 변경
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2021. 01. 18
	 */
	void updateGoodsStatOnly(Goods goods);

	/**
	 * 상품코드 생성
	 *
	 * @param goods
	 * @author eskim
	 * @since 2020. 10. 30
	 */
	void createGoodsSequence(Goods goods);

	/**
	 * 상품 기본 정보 수정 - 대량엑셀
	 *
	 * @param goods
	 * @author eskim
	 * @since 2021. 1. 20
	 */
	void updateGoodsMass(Goods goods);

	/**
	 * 상품 품목변경
	 *
	 * @param goods
	 * @author eskim
	 * @since 2021. 1. 24
	 */
	void updateGoodItemKindCd(Goods goods);

	/**
	 * 상품정보고시 항목 목록
	 * @param notiInfo
	 * @return
	 * @author eskim
	 * @since 2021. 1. 24
	 */
	Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo);

	/**
	 * 상품옵션 패턴조회
	 * @param option
	 * @return
	 * @author eskim
	 * @since 2021. 2. 5
	 */
	Option getGoodsOption(Option option);

	/**
	 * 상품옵션 중복건수여부 확인
	 * @param option
	 * @return
	 * @author eskim
	 * @since 2021. 2. 5
	 */
	int getGoodsOptionDupCountCheck(Option option);

	/**
	 * 사은품 목록
	 *
	 * @param GoodsSearch
	 * @return Collection<FreeGoods>
	 * @author eskim
	 * @since 2020. 12. 28
	 */
	Collection<FreeGoods> getFreeGoodsList(GoodsSearch goodsSearch);

	/**
	 * 사은품 정보 수정
	 * @param freeGoods
	 * @author eskim
	 * @since 2020. 12. 28
	 */
	public void updateFreeGoods(FreeGoods freeGoods);

	/**
	 * 상품 안전인증 조회
	 *
	 * @param goods
	 * @return
	 * @author eskim
	 * @since 2021. 05. 10
	 */
	GoodsSafeNo getGoodsDetailSafe(Goods goods);

	/**
	 * 안전인증대상 상품 저장
	 *
	 * @author eskim
	 * @since 2020. 12. 07
	 */
	void saveGoodsSafeNo(GoodsSafeNo goodsSafeNo);

	/**
	 * 상품 모델 정보
	 *
	 * @param goodsImg
	 * @return
	 * @author eskim
	 * @since 2021. 04. 27
	 */
	GoodsImg getGoodsModelInfo(GoodsImg goodsImg);

	/**
	 * 상품 모델 정보 저장
	 *
	 * @param goodsImg
	 * @return
	 * @author eskim
	 * @since 2021. 04. 27
	 */
	void saveGoodsModelInfo(GoodsImg goodsImg);

	/**
	 * 상품옵션1 존재 여부 확인
	 *
	 * @param
	 * @return
	 * @author eskim
	 * @since 2021. 05. 16
	 */
	int getGoodsOption1Count(Option option);

	/**
	 * 구성상품 저장
	 *
	 * @param goodsCompose
	 * @author eskim
	 * @since 2021. 05. 26
	 */
	void saveGoodsCompose(GoodsCompose goodsCompose);

	/**
	 * 구성상품 목록
	 *
	 * @param goodsNotiInfo
	 * @return
	 * @author eskim
	 * @since 2021. 05. 26
	 */
	Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods);

	/**
	 * wms 상품 색상, 재고판매율 적용 조회
	 *
	 * @param ifProductSku
	 * @return
	 * @author eskim
	 * @since 2021. 05. 29
	 */
	Option getWmsColorStock(IfProductSku ifProductSku);

	/**
	 * 자사브랜드, 업체 연관정보 확인
	 *
	 * @param brand
	 * @return
	 * @author eskim
	 * @since 2021. 07. 03
	 */
	int getBrandSupplyCount(Brand brand);

	/**
	 * WMS입고상품관리 목록 건수
	 * @param WmsGoods
	 * @return int
	 * @author card007
	 * @since 2021. 11. 25
	 */
	int getGoodsWmsIncomelotListCount(WmsGoods wmsGoods);

	/**
	 * WMS입고상품관리 목록 조회
	 * @param WmsGoods
	 * @return Collection<WmsGoods>
	 * @author card007
	 * @since 2021. 11. 25
	 */
	Collection<WmsGoods> getGoodsWmsIncomelotList(WmsGoods wmsGoods);

	/**
	 *  WMS 입고상품 사은품 등록
	 * @param FreeGoods
	 * @author card007
	 * @since 2021. 11. 25
	 */
	void saveFreeGoods(FreeGoods freeGoods);

	/**
	 * WMS입고단품목록 건수
	 * 
	 * @param IfIncomelot
	 * @return int
	 * @author card007
	 * @since 2021. 11. 25
	 */
	int getGoodsWmsIncomelotSkuListCount(IfIncomelot iIfIncomelot);

	/**
	 * WMS입고단품목록 조회
	 * 
	 * @param IfIncomelot
	 * @return Collection<WmsGoods>
	 * @author card007
	 * @since 2021. 11. 25
	 */
	Collection<WmsGoods> getGoodsWmsIncomelotSkuList(IfIncomelot ifIncomelot);
	
	/**
	 * 상품 동영상 목록 조회
	 *
	 * @param goodsVideo
	 * @return
	 * @author eskim
	 * @since 2020. 11. 16
	 */
	Collection<GoodsVideo> getGoodsVideoList(GoodsVideo goodsVideo);

	/**
	 * 상품 동영상 사용안함으로 변경
	 *
	 * @param video
	 * @author eskim
	 * @since 2020. 11. 16
	 */
	void updateNotUseGoodsVideo(GoodsVideo goodsVideo);

	/**
	 * 동영상 등록
	 *
	 * @param video
	 * @author eskim
	 * @since 2020. 11. 16
	 */
	void createGoodsVideo(GoodsVideo goodsVideo);

	/**
	 * 동영상 수정
	 *
	 * @param video
	 * @author eskim
	 * @since 2020. 11. 16
	 */
	void updateGoodsVideo(GoodsVideo goodsVideo);
	
	/**
	 * 이미지 덮어쓰기 경로 확인
	 *
	 * @param goodsImg
	 * @author jmh
	 * @since 2021. 12. 14
	 */
	GoodsImg getGoodsImage(GoodsImg goodsImg);	
}
