package cokr.xit.ens.modules.kkomydoc.domain.repository;

import cokr.xit.ens.core.utils.CmmnUtil;
import cokr.xit.ens.modules.kkomydoc.domain.SendDetailKkoMydoc;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;

import java.util.List;
import java.util.Optional;

import static cokr.xit.ens.modules.common.ctgy.intgrnbill.support.entity.QBill.bill;
import static cokr.xit.ens.modules.common.domain.QSendMast.sendMast;
import static cokr.xit.ens.modules.kkomydoc.domain.QSendDetailKkoMydoc.sendDetailKkoMydoc;

@RequiredArgsConstructor
public class SendDetailKkoMydocRepositoryImpl implements SendDetailKkoMydocRepositoryCustom {
    private final JPAQueryFactory query;

//    @Override
//    public List<SendDetailKkoMydoc> findAllFetchBySendMastIdAndMkBillUseYAndUrlIsNull(Long sendMastId, boolean urlIsNull) {
//        return query.selectFrom(sendDetailKkoMydoc)
//                .innerJoin(sendDetailKkoMydoc.sendMast, sendMast)
//                .fetchJoin()
//                .leftJoin(sendDetailKkoMydoc.kkoBillMast, kkoBillMast)
//                .fetchJoin()
//                .where(sendDetailKkoMydoc.sendMast.sendMastId.eq(sendMastId)
//                        .and(sendDetailKkoMydoc.mkBillUseYn.eq("Y"))
//                        .and(urlIsNull ? sendDetailKkoMydoc.kkoBillMast.url.isNull() : sendDetailKkoMydoc.kkoBillMast.url.isNotNull())
//                )
//                .fetch();
//    }

    @Override
    public List<SendDetailKkoMydoc> findAllFetchBySendMastId(Long sendMastId) {
        return query.selectFrom(sendDetailKkoMydoc)
                .innerJoin(sendDetailKkoMydoc.sendMast, sendMast).fetchJoin()
//                .leftJoin(sendDetailKkoMydoc.kkoBillMast, kkoBillMast)
                .leftJoin(sendDetailKkoMydoc.bill, bill).fetchJoin()
                .where(sendDetailKkoMydoc.sendMast.sendMastId.eq(sendMastId))
                .fetch();
    }

    @Override
    public Optional<SendDetailKkoMydoc> findFetchByPropExternalDocumentUuidAndDocumentBinderUuid(String propExternalDocumentUuid, String documentBinderUuid) {
        BooleanBuilder builder = new BooleanBuilder();
        builder.and(sendDetailKkoMydoc.documentBinderUuid.eq(documentBinderUuid));
        if (!CmmnUtil.isEmpty(propExternalDocumentUuid))
            builder.and(sendDetailKkoMydoc.propExternalDocumentUuid.eq(propExternalDocumentUuid));

        return Optional.ofNullable(query.selectFrom(sendDetailKkoMydoc)
                .innerJoin(sendDetailKkoMydoc.sendMast, sendMast).fetchJoin()
                .where(builder)
                .fetchOne());
    }
}
