//go:build ignore

// Bu araç yalnız KALICI VERİTABANI testi içindir: mevcut kullanıcıları listeler
// ve bir kullanıcıya yönetici rolü verir (yerel doğrulama için).
// Kalıcı çalışma zamanına DAHİL EDİLMEZ (build tag `ignore`).
package main

import (
	"context"
	"fmt"
	"os"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"golang.org/x/crypto/bcrypt"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
	defer cancel()

	uri := os.Getenv("MONGO_URI")
	if uri == "" {
		uri = "mongodb://fikoyt:fikoyt1299@localhost:27017/?authSource=admin"
	}
	db := os.Getenv("MONGO_DATABASE")
	if db == "" {
		db = "fiko_ai"
	}

	cl, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
	if err != nil {
		panic(err)
	}
	defer func() { _ = cl.Disconnect(context.Background()) }()

	users := cl.Database(db).Collection("users")
	cur, err := users.Find(ctx, bson.M{})
	if err != nil {
		panic(err)
	}
	var all []bson.M
	if err := cur.All(ctx, &all); err != nil {
		panic(err)
	}
	fmt.Println("--- mevcut kullanıcılar ---")
	for _, u := range all {
		fmt.Printf("id=%v username=%v role=%v disabled=%v\n", u["_id"], u["username"], u["role"], u["disabled"])
	}

	// Argümanlar: -promote <kullanıcı> | -password <kullanıcı> <yeniParola> | -delete <kullanıcı>
	//
	// SIRA ÖNEMLİ: seçenekler TEK bir taramada ayrıştırılır, sonra dal seçilir.
	// Ayrı ayrı taramalarda "target == \"\"" kontrolü erken çalışır ve diğer
	// seçenekler (ör. -password) hiç uygulanmadan çıkar (gerçekte oldu).
	target, newPass, del := "", "", ""
	for i, a := range os.Args {
		if i == 0 {
			continue // program adı
		}
		switch a {
		case "-promote":
			if i+1 < len(os.Args) {
				target = os.Args[i+1]
			}
		case "-password":
			if i+2 < len(os.Args) {
				target, newPass = os.Args[i+1], os.Args[i+2]
			}
		case "-delete":
			if i+1 < len(os.Args) {
				target, del = os.Args[i+1], os.Args[i+1]
			}
		}
	}
	if target == "" {
		fmt.Println("kullanım: -promote <k> | -password <k> <yeniParola> | -delete <k>")
		return
	}

	if del != "" {
		res, err := users.DeleteOne(ctx, bson.M{"username": del})
		if err != nil {
			panic(err)
		}
		fmt.Printf("delete %s -> %d kayit silindi\n", del, res.DeletedCount)
		return
	}

	if newPass != "" {
		hash, err := hashPassword(newPass)
		if err != nil {
			panic(err)
		}
		res, err := users.UpdateOne(ctx,
			bson.M{"username": target},
			bson.M{"$set": bson.M{"passwordHash": hash, "disabled": false}},
		)
		if err != nil {
			panic(err)
		}
		fmt.Printf("password reset %s -> %d kayit\n", target, res.MatchedCount)
		return
	}
	res, err := users.UpdateOne(ctx,
		bson.M{"username": target},
		bson.M{"$set": bson.M{"role": "admin", "disabled": false}},
	)
	if err != nil {
		panic(err)
	}
	fmt.Printf("promote %s -> eşleşen kayıt: %d\n", target, res.MatchedCount)
}

// hashPassword, bcrypt özeti üretir (user.Service ile aynı algoritma/maliyet).
func hashPassword(p string) (string, error) {
	if len(p) < 8 {
		return "", fmt.Errorf("parola en az 8 karakter olmalı")
	}
	h, err := bcrypt.GenerateFromPassword([]byte(p), bcrypt.DefaultCost)
	if err != nil {
		return "", err
	}
	return string(h), nil
}
