/*
 * Copyright (c) 2005, 2021 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     SAP - initial API and implementation

package org.eclipse.persistence.testing.tests.wdf.jpa1.query;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;

import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;

import org.eclipse.persistence.testing.framework.wdf.Bugzilla;
import org.eclipse.persistence.testing.framework.wdf.JPAEnvironment;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee;
import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base;
import org.junit.Test;

@SuppressWarnings("unchecked")
public class TestSetFunctions extends JPA1Base {

    private void verifyBigDecimal(EntityManager em, String txt, BigDecimal expected) {
        Query query = em.createQuery(txt);
        List result = query.getResultList();
        verify(result.size() == 1, "wrong resultcount");
        Iterator iter = result.iterator();
        verify(iter.hasNext(), "no row found");
        BigDecimal bigDecimal = (BigDecimal) iter.next();
        verify(bigDecimal.compareTo(expected) == 0, "wrong result: " + bigDecimal);
        verify(!iter.hasNext(), "too many rows found");
    }

    private void verifyDouble(EntityManager em, String txt, Double expected) {
        Query query = em.createQuery(txt);
        List result = query.getResultList();
        verify(result.size() == 1, "wrong resultcount");
        Iterator iter = result.iterator();
        verify(iter.hasNext(), "no row found");
        Double doubleValue = (Double) iter.next();
        verify(doubleValue.compareTo(expected) == 0, "wrong result: " + doubleValue);
        verify(!iter.hasNext(), "too many rows found");
    }

    @Override
    protected void setup() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            env.beginTransaction(em);
            em.persist(new Employee(1, "Ulla", "Schmidt", null, BigDecimal.valueOf(5000)));
            em.persist(new Employee(2, "Knut", "M\u00fcller", null, BigDecimal.valueOf(6000)));
            em.persist(new Employee(3, "Kuno", "Maier", null, BigDecimal.valueOf(10000)));
            env.commitTransactionAndClear(em);
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testSum() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyBigDecimal(em, "select sum(e.salary) from Employee e", BigDecimal.valueOf(21000));
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testMin() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyBigDecimal(em, "select min(e.salary) from Employee e", BigDecimal.valueOf(5000));
            verifyBigDecimal(em, "select min(e.salary) from Employee e where e.firstname like 'K%'", BigDecimal.valueOf(6000));
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testFindEmployeeWithMinimalSalary() {
        // TODO subqueries not finished yet
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            Query query = em
                    .createQuery("select e from Employee e where e.salary = (select min (e2.salary) from Employee e2) ");
            List result = query.getResultList();
            Iterator iterator = result.iterator();
            verify(iterator.hasNext(), "no row found");
            Employee first = (Employee) iterator.next();
            verify(first.getId() == 1, "wrong employee");
            verify(!iterator.hasNext(), "too many rows");
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testMax() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyBigDecimal(em, "select max(e.salary) from Employee e", BigDecimal.valueOf(10000));
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testAverage() {
        JPAEnvironment env = getEnvironment();
        EntityManager em = env.getEntityManager();
        try {
            verifyDouble(em, "select avg(e.salary) from Employee e", 7000.0);
        } finally {
            closeEntityManager(em);
        }
    }
}
