package pwc.taxtech.atms.invoice;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.session.RowBounds;
import pwc.taxtech.atms.MyVatMapper;
import pwc.taxtech.atms.vat.dpo.OutputInvoiceDto;
import pwc.taxtech.atms.vat.dpo.OutputVATInvoiceInfoDto;
import pwc.taxtech.atms.vat.dpo.QueryOutputDto;
import pwc.taxtech.atms.vat.entity.OutputInvoice;
import pwc.taxtech.atms.vat.entity.OutputInvoiceExample;
import pwc.taxtech.atms.vat.entity.OutputInvoiceKey;

import java.util.List;

@Mapper
public interface OutputInvoiceMapper extends MyVatMapper {
    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    long countByExample(OutputInvoiceExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int deleteByExample(OutputInvoiceExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int deleteByPrimaryKey(OutputInvoiceKey key);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int insert(OutputInvoice record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int insertSelective(OutputInvoice record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    List<OutputInvoice> selectByExampleWithRowbounds(OutputInvoiceExample example, RowBounds rowBounds);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    List<OutputInvoice> selectByExample(OutputInvoiceExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    OutputInvoice selectByPrimaryKey(OutputInvoiceKey key);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int updateByExampleSelective(@Param("record") OutputInvoice record, @Param("example") OutputInvoiceExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int updateByExample(@Param("record") OutputInvoice record, @Param("example") OutputInvoiceExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int updateByPrimaryKeySelective(OutputInvoice record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table PWC_INVOICE.OUTPUT_INVOICE
     *
     * @mbg.generated
     */
    int updateByPrimaryKey(OutputInvoice record);

    @Select("SELECT  " +
            "    o.PERIOD_ID as periodId, " +
            "    o.INVOICE_TYPE as invoiceType, " +
            "    o.CLASS_CODE as classCode, " +
            "    o.INVOICE_NUMBER as invoiceNumber, " +
            "    o.BUYER_NAME as buyerName, " +
            "    o.BUYER_TAX_NUMBER as buyerTaxNumber, " +
            "    o.BANK_ACCOUNT as bankAccount, " +
            "    o.PHONE_NUM as phoneNum, " +
            "    o.INVOICE_DATE as invoiceDate, " +
            "    oi.CODE_VERSION as codeVersion, " +
            "    oi.PRODUCT_NAME as productName, " +
            "    oi.DOCUMENT_NUM as documentNum, " +
            "    oi.PRODUCT_STANDARD as productStandard, " +
            "    oi.UNIT as unit, " +
            "    oi.QUANTITY as quantity, " +
            "    oi.UNIT_PRICE as unitPrice, " +
            "    oi.AMOUNT as amount, " +
            "    oi.TAX_RATE as taxRate, " +
            "    oi.TAX_AMOUNT as taxAmount, " +
            "    oi.TAX_CLASS_CODE  as taxClassCode " +
            "FROM " +
            "    OUTPUT_VAT_INVOICE o, " +
            "    OUTPUT_VAT_INVOICE_ITEM oi, " +
            "    (SELECT  " +
            "        INVOICE_ID, MIN(SeqNo) MIN_SEQ_NO " +
            "    FROM " +
            "        OUTPUT_VAT_INVOICE_ITEM " +
            "    GROUP BY InvoiceID) m " +
            "WHERE " +
            "    o.INVOICE_ID = oi.INVOICE_ID " +
            "        AND o.INVOICE_ID = m.INVOICE_ID " +
            "        AND oi.SEQ_NO = m.MIN_SEQ_NO  " +
            "        AND o.PERIOD_ID = #{period}" +
            " UNION SELECT  " +
            "    o2.periodID, " +
            "    NULL AS invoiceType, " +
            "    '' AS classCode, " +
            "    '' AS invoiceNumber, " +
            "    '' AS buyerName, " +
            "    '' AS buyerTaxNumber, " +
            "    '' AS bankAccount, " +
            "    '' AS phoneNum, " +
            "    NULL AS invoiceDate, " +
            "    oi2.codeVersion, " +
            "    oi2.productName, " +
            "    oi2.documentNum, " +
            "    oi2.productStandard, " +
            "    oi2.unit, " +
            "    oi2.quantity, " +
            "    oi2.unitPrice, " +
            "    oi2.amount, " +
            "    oi2.taxRate, " +
            "    oi2.taxAmount, " +
            "    oi2.taxClassCode " +
            "FROM " +
            "    OUTPUT_VAT_INVOICE o2, " +
            "    OUTPUT_VAT_INVOICE_ITEM oi2, " +
            "    (SELECT  " +
            "        INVOICE_ID, MIN(SEQ_NO) MIN_SEQ_NO " +
            "    FROM " +
            "        OUTPUT_VAT_INVOICE_ITEM " +
            "    GROUP BY INVOICE_ID) m2 " +
            "WHERE " +
            "    o2.INVOICE_ID = oi2.INVOICE_ID " +
            "        AND o2.INVOICE_ID = m2.INVOICE_ID " +
            "        AND oi2.SEQ_NO != m2.MIN_SEQ_NO " +
            "        AND o2.PERIOD_ID = #{period}" +
            " ")
    List<OutputVATInvoiceInfoDto> queryOutputDetailWithItem(Integer period);

    List<OutputInvoiceDto> getOutputInvoiceWithDetail();

    List<OutputVATInvoiceInfoDto> selectOutputInvoiceInfoLeftJoinItem(QueryOutputDto queryDto);

}