package dev.dao;

import dev.database.DatabaseConnection;
import dev.model.Order;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Timestamp;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class OrderDao
{
    public int save(Order order)
    {
        String sql =
                """
                INSERT INTO orders
                (user_id, created_at, total_price)
                VALUES (?, ?, ?)
                """;

        try (Connection connection = DatabaseConnection.getConnection();
             PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS))
        {
            ps.setInt(1, order.getUserId());
            ps.setTimestamp(2, Timestamp.valueOf(order.getCreatedAt()));
            ps.setDouble(3, order.getTotalPrice());
            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();

            if (rs.next())
                return rs.getInt(1);

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return -1;
    }

    public List<Order> findByUserId(int userId)
    {
        List<Order> orders = new ArrayList<>();

        String sql =
                """
                SELECT *
                FROM orders
                WHERE user_id = ?
                ORDER BY created_at DESC
                """;

        try (Connection connection = DatabaseConnection.getConnection();
             PreparedStatement ps = connection.prepareStatement(sql))
        {
            ps.setInt(1, userId);
            ResultSet rs = ps.executeQuery();

            while (rs.next())
            {
                Order order = new Order();
                order.setId(rs.getInt("id"));
                order.setUserId(rs.getInt("user_id"));
                order.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime());
                order.setTotalPrice(rs.getDouble("total_price"));

                orders.add(order);
            }

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return orders;
    }
}