package services

import (
	"context"

	"github.com/jackc/pgx/v5/pgxpool"
)

type WaliKelasService struct {
	pool *pgxpool.Pool
}

type AssignedClass struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}

func NewWaliKelasService(pool *pgxpool.Pool) *WaliKelasService {
	return &WaliKelasService{pool: pool}
}

func (s *WaliKelasService) GetAssignedClasses(userID string) ([]AssignedClass, error) {
	ctx := context.Background()

	// Try multi-class assignment first
	rows, err := s.pool.Query(ctx,
		`SELECT DISTINCT c.id, c.name
		 FROM classes c
		 JOIN wali_kelas_classes wkc ON wkc.class_id = c.id
		 WHERE wkc.wali_kelas_id = $1
		 ORDER BY c.name ASC`, userID,
	)
	if err == nil {
		defer rows.Close()
		var classes []AssignedClass
		for rows.Next() {
			var c AssignedClass
			if err := rows.Scan(&c.ID, &c.Name); err == nil {
				classes = append(classes, c)
			}
		}
		if len(classes) > 0 {
			return classes, nil
		}
	}

	// Fallback to single class assignment
	rows2, err := s.pool.Query(ctx,
		`SELECT c.id, c.name FROM users u
		 JOIN classes c ON c.id = u.class_id
		 WHERE u.id = $1 LIMIT 1`, userID,
	)
	if err != nil {
		return nil, err
	}
	defer rows2.Close()

	var classes []AssignedClass
	for rows2.Next() {
		var c AssignedClass
		rows2.Scan(&c.ID, &c.Name)
		classes = append(classes, c)
	}
	return classes, nil
}

func ResolveSelectedClassID(classes []AssignedClass, requestedClassID *string) *string {
	if len(classes) == 0 {
		return nil
	}
	if requestedClassID != nil {
		for _, c := range classes {
			if c.ID == *requestedClassID {
				return requestedClassID
			}
		}
	}
	id := classes[0].ID
	return &id
}

func (s *WaliKelasService) CreateWaliKelasOrder(waliKelasID, studentID, eventID, ticketClassID, orderID string, quantity int, notes *string) error {
	_, err := s.pool.Exec(context.Background(),
		`INSERT INTO wali_kelas_orders (wali_kelas_id, student_id, event_id, ticket_class_id, order_id, quantity, notes)
		 VALUES ($1, $2, $3, $4, $5, $6, $7)`,
		waliKelasID, studentID, eventID, ticketClassID, orderID, quantity, notes,
	)
	return err
}
