package store

import (
	"context"
	"database/sql"
)

func (db *DB) GetPlanBySlug(ctx context.Context, slug string) (*Plan, error) {
	row := db.QueryRowContext(ctx, `
		SELECT id, slug, name, max_active_leads, max_add_per_day, max_export_per_day,
		       can_export, price_cents, is_active
		FROM plans WHERE slug = ? AND is_active = TRUE`, slug)
	return scanPlan(row)
}

func (db *DB) GetPlanByID(ctx context.Context, id int) (*Plan, error) {
	row := db.QueryRowContext(ctx, `
		SELECT id, slug, name, max_active_leads, max_add_per_day, max_export_per_day,
		       can_export, price_cents, is_active
		FROM plans WHERE id = ?`, id)
	return scanPlan(row)
}

func (db *DB) ListPlans(ctx context.Context) ([]Plan, error) {
	rows, err := db.QueryContext(ctx, `
		SELECT id, slug, name, max_active_leads, max_add_per_day, max_export_per_day,
		       can_export, price_cents, is_active
		FROM plans ORDER BY price_cents`)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var out []Plan
	for rows.Next() {
		p, err := scanPlanRows(rows)
		if err != nil {
			return nil, err
		}
		out = append(out, *p)
	}
	return out, rows.Err()
}

func scanPlan(row *sql.Row) (*Plan, error) {
	var p Plan
	var maxAdd sql.NullInt64
	err := row.Scan(&p.ID, &p.Slug, &p.Name, &p.MaxActiveLeads, &maxAdd,
		&p.MaxExportPerDay, &p.CanExport, &p.PriceCents, &p.IsActive)
	if err != nil {
		return nil, err
	}
	if maxAdd.Valid {
		v := int(maxAdd.Int64)
		p.MaxAddPerDay = &v
	}
	return &p, nil
}

func scanPlanRows(rows *sql.Rows) (*Plan, error) {
	var p Plan
	var maxAdd sql.NullInt64
	err := rows.Scan(&p.ID, &p.Slug, &p.Name, &p.MaxActiveLeads, &maxAdd,
		&p.MaxExportPerDay, &p.CanExport, &p.PriceCents, &p.IsActive)
	if err != nil {
		return nil, err
	}
	if maxAdd.Valid {
		v := int(maxAdd.Int64)
		p.MaxAddPerDay = &v
	}
	return &p, nil
}
