// internal/repository/order.go
package repository

import (
	"database/sql"
	"time"
	"websocket-server/internal/model"
)

type OrderRepository struct {
	db *sql.DB
}

func NewOrderRepository(db *sql.DB) *OrderRepository {
	return &OrderRepository{db: db}
}

func (r *OrderRepository) GetLatestBuyOrders(limit int, thresholdDuration time.Duration) ([]model.Order, error) {
	query := `
		SELECT
			o.id,
			COALESCE(b.name, '') as bank_name,
			COALESCE(b.logo, '') as bank_logo,
			COALESCE(lt.name, '') as loan_type,
			COALESCE(p.percent, '') as percent,
			COALESCE(t.time, '') as time,
			COALESCE(o.price, 0) as price,
			COALESCE(o.point, 0) as point,
			o.created_at
		FROM orders o
		LEFT JOIN banks b ON o.bank_id = b.id
		LEFT JOIN loan_types lt ON o.loan_type_id = lt.id
		LEFT JOIN percents p ON o.percent_id = p.id
		LEFT JOIN loan_times t ON o.time_id = t.id
		WHERE o.type = 'buy'
		  AND o.status IN ('pending', 'matched')
		  AND o.is_paid = true
		  AND (
		      o.matched_with_id IS NULL
		      OR EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - o.matched_at)) > $2
		  )
		ORDER BY o.created_at DESC
		LIMIT $1
	`

	thresholdSeconds := int(thresholdDuration.Seconds())
	rows, err := r.db.Query(query, limit, thresholdSeconds)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	orders := make([]model.Order, 0, limit)
	for rows.Next() {
		var o model.Order
		o.Type = "buy"
		err := rows.Scan(
			&o.ID, &o.BankName, &o.BankLogo, &o.LoanType,
			&o.Percent, &o.Time, &o.Price,&o.Point, &o.CreatedAt,
		)
		if err != nil {
			return nil, err
		}
		orders = append(orders, o)
	}

	return orders, rows.Err()
}

func (r *OrderRepository) GetLatestSellOrders(limit int, thresholdDuration time.Duration) ([]model.Order, error) {
	query := `
		SELECT
			o.id,
			COALESCE(b.name, '') as bank_name,
			COALESCE(b.logo, '') as bank_logo,
			COALESCE(lt.name, '') as loan_type,
			COALESCE(p.percent, '') as percent,
			COALESCE(t.time, '') as time,
			COALESCE(o.price, 0) as price,
			COALESCE(o.point, 0) as point,
			o.created_at
		FROM orders o
		LEFT JOIN banks b ON o.bank_id = b.id
		LEFT JOIN loan_types lt ON o.loan_type_id = lt.id
		LEFT JOIN percents p ON o.percent_id = p.id
		LEFT JOIN loan_times t ON o.time_id = t.id
		WHERE o.type = 'sell'
		  AND o.status IN ('pending', 'matched')
		  AND o.is_paid = true
		  AND (
		      o.matched_with_id IS NULL
		      OR EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - o.matched_at)) > $2
		  )
		ORDER BY o.created_at DESC
		LIMIT $1
	`

	thresholdSeconds := int(thresholdDuration.Seconds())
	rows, err := r.db.Query(query, limit, thresholdSeconds)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	orders := make([]model.Order, 0, limit)
	for rows.Next() {
		var o model.Order
		o.Type = "sell"
		err := rows.Scan(
			&o.ID, &o.BankName, &o.BankLogo, &o.LoanType,
			&o.Percent, &o.Time, &o.Price,&o.Point, &o.CreatedAt,
		)
		if err != nil {
			return nil, err
		}
		orders = append(orders, o)
	}

	return orders, rows.Err()
}
