// package seed

// import (
// 	"errors"
// 	"fmt"
// 	"strings"
// 	"time"

// 	entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
// 	"gitlab.com/mbugroup/lti-api.git/internal/utils"

// 	"gorm.io/gorm"
// )

// func Run(db *gorm.DB) error {
// 	return db.Transaction(func(tx *gorm.DB) error {
// 		users, err := seedUsers(tx)
// 		if err != nil {
// 			return err
// 		}
// 		adminID := users["admin"]

// 		uoms, err := seedUoms(tx, adminID)
// 		if err != nil {
// 			return err
// 		}

// 		areas, err := seedAreas(tx, adminID)
// 		if err != nil {
// 			return err
// 		}

// 		locations, err := seedLocations(tx, adminID, areas)
// 		if err != nil {
// 			return err
// 		}

// 		productCategories, err := seedProductCategories(tx, adminID)
// 		if err != nil {
// 			return err
// 		}

// 		if _, err := seedFlocks(tx, adminID); err != nil {
// 			return err
// 		}

// 		if _, err := seedFcr(tx, adminID); err != nil {
// 			return err
// 		}

// 		kandangs, err := seedKandangs(tx, adminID, locations, users)
// 		if err != nil {
// 			return err
// 		}

// 		if err := seedWarehouses(tx, adminID, areas, locations, kandangs); err != nil {
// 			return err
// 		}

// 		suppliers, err := seedSuppliers(tx, adminID)
// 		if err != nil {
// 			return err
// 		}

// 		if err := seedCustomers(tx, adminID, users); err != nil {
// 			return err
// 		}

// 		if err := seedProducts(tx, adminID, uoms, productCategories, suppliers); err != nil {
// 			return err
// 		}

// 		if err := seedNonstocks(tx, adminID, uoms, suppliers); err != nil {
// 			return err
// 		}

// 		if err := seedBanks(tx, adminID); err != nil {
// 			return err
// 		}

// 		if err := seedProductWarehouse(tx, adminID); err != nil {
// 			return err
// 		}

// 		if err := seedTransferStock(tx); err != nil {
// 			return err
// 		}
// 		fmt.Println("✅ Master data seeding completed")
// 		return nil
// 	})
// }

// func seedUsers(tx *gorm.DB) (map[string]uint, error) {
// 	seeds := []struct {
// 		Key  string
// 		Data entity.User
// 	}{
// 		{
// 			Key:  "admin",
// 			Data: entity.User{Email: "admin@mbugroup.id", IdUser: 1, Name: "Super Admin"},
// 		},
// 	}

// 	result := make(map[string]uint, len(seeds))

// 	for _, seed := range seeds {
// 		var user entity.User
// 		err := tx.Where("email = ?", seed.Data.Email).First(&user).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			user = seed.Data
// 			if err := tx.Create(&user).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		}
// 		result[seed.Key] = user.Id
// 	}

// 	return result, nil
// }

// func seedUoms(tx *gorm.DB, createdBy uint) (map[string]uint, error) {
// 	names := []string{"Kilogram", "Gram", "Liter", "Unit", "Ekor"}
// 	result := make(map[string]uint, len(names))

// 	for _, name := range names {
// 		var uom entity.Uom
// 		err := tx.Where("name = ?", name).First(&uom).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			uom = entity.Uom{Name: name, CreatedBy: createdBy}
// 			if err := tx.Create(&uom).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		}
// 		result[name] = uom.Id
// 	}

// 	return result, nil
// }

// func seedAreas(tx *gorm.DB, createdBy uint) (map[string]uint, error) {
// 	names := []string{"Priangan", "Banten"}
// 	result := make(map[string]uint, len(names))

// 	for _, name := range names {
// 		var area entity.Area
// 		err := tx.Where("name = ?", name).First(&area).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			area = entity.Area{Name: name, CreatedBy: createdBy}
// 			if err := tx.Create(&area).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		}
// 		result[name] = area.Id
// 	}

// 	return result, nil
// }

// func seedLocations(tx *gorm.DB, createdBy uint, areas map[string]uint) (map[string]uint, error) {
// 	seeds := []struct {
// 		Name    string
// 		Address string
// 		Area    string
// 	}{
// 		{"Singaparna", "Tasik", "Priangan"},
// 		{"Cikaum", "Cikaum", "Banten"},
// 	}

// 	result := make(map[string]uint, len(seeds))

// 	for _, seed := range seeds {
// 		areaID, ok := areas[seed.Area]
// 		if !ok {
// 			return nil, fmt.Errorf("area %s not seeded", seed.Area)
// 		}

// 		var loc entity.Location
// 		err := tx.Where("name = ?", seed.Name).First(&loc).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			loc = entity.Location{
// 				Name:      seed.Name,
// 				Address:   seed.Address,
// 				AreaId:    areaID,
// 				CreatedBy: createdBy,
// 			}
// 			if err := tx.Create(&loc).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		}
// 		result[seed.Name] = loc.Id
// 	}

// 	return result, nil
// }

// func seedFlocks(tx *gorm.DB, createdBy uint) (map[string]uint, error) {
// 	names := []string{"Flock Priangan", "Flock Banten"}
// 	result := make(map[string]uint, len(names))

// 	for _, name := range names {
// 		var flock entity.Flock
// 		err := tx.Where("name = ?", name).First(&flock).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			flock = entity.Flock{
// 				Name:      name,
// 				CreatedBy: createdBy,
// 			}
// 			if err := tx.Create(&flock).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		} else {
// 			if err := tx.Model(&entity.Flock{}).Where("id = ?", flock.Id).Updates(map[string]any{
// 				"created_by": createdBy,
// 			}).Error; err != nil {
// 				return nil, err
// 			}
// 		}
// 		result[name] = flock.Id
// 	}

// 	return result, nil
// }

// func seedKandangs(tx *gorm.DB, createdBy uint, locations map[string]uint, users map[string]uint) (map[string]uint, error) {
// 	seeds := []struct {
// 		Name     string
// 		Status   utils.KandangStatus
// 		Capacity float64
// 		Location string
// 		PicKey   string
// 	}{
// 		{Name: "Singaparna 1", Status: utils.KandangStatusNonActive, Capacity: 50000, Location: "Singaparna", PicKey: "admin"},
// 		{Name: "Singaparna 2", Status: utils.KandangStatusNonActive, Capacity: 50000, Location: "Singaparna", PicKey: "admin"},
// 		{Name: "Cikaum 1", Status: utils.KandangStatusNonActive, Capacity: 50000, Location: "Cikaum", PicKey: "admin"},
// 		{Name: "Cikaum 2", Status: utils.KandangStatusNonActive, Capacity: 50000, Location: "Cikaum", PicKey: "admin"},
// 	}

// 	result := make(map[string]uint, len(seeds))

// 	for _, seed := range seeds {
// 		locID, ok := locations[seed.Location]
// 		if !ok {
// 			return nil, fmt.Errorf("location %s not seeded", seed.Location)
// 		}
// 		picID, ok := users[seed.PicKey]
// 		if !ok {
// 			return nil, fmt.Errorf("user %s not seeded", seed.PicKey)
// 		}

// 		var kandang entity.Kandang
// 		err := tx.Where("name = ?", seed.Name).First(&kandang).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			kandang = entity.Kandang{
// 				Name:       seed.Name,
// 				Status:     string(seed.Status),
// 				LocationId: locID,
// 				PicId:      picID,
// 				CreatedBy:  createdBy,
// 			}
// 			if err := tx.Create(&kandang).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		} else {
// 			updates := map[string]any{
// 				"location_id": locID,
// 				"pic_id":      picID,
// 				"status":      string(seed.Status),
// 			}
// 			if err := tx.Model(&entity.Kandang{}).Where("id = ?", kandang.Id).Updates(updates).Error; err != nil {
// 				return nil, err
// 			}
// 		}
// 		result[seed.Name] = kandang.Id
// 	}

// 	return result, nil
// }

// func seedWarehouses(tx *gorm.DB, createdBy uint, areas map[string]uint, locations map[string]uint, kandangs map[string]uint) error {
// 	seeds := []struct {
// 		Name     string
// 		Type     string
// 		Area     string
// 		Location *string
// 		Kandang  *string
// 	}{
// 		{Name: "Gudang Priangan", Type: string(utils.WarehouseTypeArea), Area: "Priangan"},
// 		{Name: "Gudang Singaparna", Type: string(utils.WarehouseTypeLokasi), Area: "Priangan", Location: strPtr("Singaparna")},
// 		{Name: "Gudang Singaparna 1", Type: string(utils.WarehouseTypeKandang), Area: "Priangan", Location: strPtr("Singaparna"), Kandang: strPtr("Singaparna 1")},
// 		{Name: "Gudang Singaparna 2", Type: string(utils.WarehouseTypeKandang), Area: "Priangan", Location: strPtr("Singaparna"), Kandang: strPtr("Singaparna 2")},
// 		{Name: "Gudang Banten", Type: string(utils.WarehouseTypeArea), Area: "Banten"},
// 		{Name: "Gudang Cikaum", Type: string(utils.WarehouseTypeLokasi), Area: "Banten", Location: strPtr("Cikaum")},
// 		{Name: "Gudang Cikaum 1", Type: string(utils.WarehouseTypeKandang), Area: "Banten", Location: strPtr("Cikaum"), Kandang: strPtr("Cikaum 1")},
// 		{Name: "Gudang Cikaum 2", Type: string(utils.WarehouseTypeKandang), Area: "Banten", Location: strPtr("Cikaum"), Kandang: strPtr("Cikaum 2")},
// 	}

// 	for _, seed := range seeds {
// 		areaID, ok := areas[seed.Area]
// 		if !ok {
// 			return fmt.Errorf("area %s not seeded", seed.Area)
// 		}

// 		var warehouse entity.Warehouse
// 		err := tx.Where("name = ?", seed.Name).First(&warehouse).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			warehouse = entity.Warehouse{
// 				Name:      seed.Name,
// 				Type:      seed.Type,
// 				AreaId:    areaID,
// 				CreatedBy: createdBy,
// 			}
// 		} else if err != nil {
// 			return err
// 		}

// 		if seed.Location != nil {
// 			locID, ok := locations[*seed.Location]
// 			if !ok {
// 				return fmt.Errorf("location %s not seeded", *seed.Location)
// 			}
// 			warehouse.LocationId = uintPtr(locID)
// 		}
// 		if seed.Kandang != nil {
// 			kandangID, ok := kandangs[*seed.Kandang]
// 			if !ok {
// 				return fmt.Errorf("kandang %s not seeded", *seed.Kandang)
// 			}
// 			warehouse.KandangId = uintPtr(kandangID)
// 		}

// 		if warehouse.Id == 0 {
// 			if err := tx.Create(&warehouse).Error; err != nil {
// 				return err
// 			}
// 		} else {
// 			if err := tx.Model(&entity.Warehouse{}).Where("id = ?", warehouse.Id).Updates(map[string]any{
// 				"type":        warehouse.Type,
// 				"area_id":     warehouse.AreaId,
// 				"location_id": warehouse.LocationId,
// 				"kandang_id":  warehouse.KandangId,
// 			}).Error; err != nil {
// 				return err
// 			}
// 		}
// 	}

// 	return nil
// }

// func seedProductCategories(tx *gorm.DB, createdBy uint) (map[string]uint, error) {
// 	seeds := []struct {
// 		Name string
// 		Code string
// 	}{
// 		{"Pullet", "PLT"},
// 		{"Bahan Baku", "RAW"},
// 		{"Day Old Chick", "DOC"},
// 		{"Telur", "EGG"},
// 	}

// 	result := make(map[string]uint, len(seeds))

// 	for _, seed := range seeds {
// 		var category entity.ProductCategory
// 		err := tx.Where("name = ?", seed.Name).First(&category).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			category = entity.ProductCategory{Name: seed.Name, Code: seed.Code, CreatedBy: createdBy}
// 			if err := tx.Create(&category).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		} else {
// 			if err := tx.Model(&entity.ProductCategory{}).Where("id = ?", category.Id).Updates(map[string]any{
// 				"code": seed.Code,
// 			}).Error; err != nil {
// 				return nil, err
// 			}
// 		}
// 		result[seed.Name] = category.Id
// 	}

// 	return result, nil
// }

// func seedSuppliers(tx *gorm.DB, createdBy uint) (map[string]uint, error) {
// 	seeds := []struct {
// 		Name     string
// 		Alias    string
// 		Category string
// 		Email    string
// 		Phone    string
// 		Address  string
// 	}{
// 		{"PT CHAROEN POKPHAND INDONESIA Tbk", "CPI", string(utils.SupplierCategorySapronak), "cpi@gmail.com", "081200000001", "Jl. Pakan 1, Bekasi"},
// 		{"BOP Vendor", "BOP", string(utils.SupplierCategoryBOP), "bop@gmail.com", "081200000002", "Jl. Veteriner 3, Bogor"},
// 		{"Ekspedisi", "EKS", string(utils.SupplierCategoryBOP), "bop@gmail.com", "081200000002", "Jl. Veteriner 3, Bogor"},
// 	}

// 	result := make(map[string]uint, len(seeds))

// 	for idx, seed := range seeds {
// 		var supplier entity.Supplier
// 		err := tx.Where("name = ?", seed.Name).First(&supplier).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			supplier = entity.Supplier{
// 				Name:          seed.Name,
// 				Alias:         seed.Alias,
// 				Pic:           "John Doe",
// 				Type:          string(utils.CustomerSupplierTypeBisnis),
// 				Category:      seed.Category,
// 				Phone:         seed.Phone,
// 				Email:         seed.Email,
// 				Address:       seed.Address,
// 				DueDate:       30,
// 				CreatedBy:     createdBy,
// 				AccountNumber: strPtr(fmt.Sprintf("%03d", idx+1)),
// 			}
// 			if err := tx.Create(&supplier).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		}
// 		result[seed.Name] = supplier.Id
// 	}

// 	return result, nil
// }

// func seedCustomers(tx *gorm.DB, createdBy uint, users map[string]uint) error {
// 	seeds := []struct {
// 		Name    string
// 		PicKey  string
// 		Address string
// 		Phone   string
// 		Email   string
// 	}{
// 		{"Abdul Azis", "admin", "Jl. Raya Utama 1, Bekasi", "082100000001", "abdul.azis@gmail.com"},
// 	}

// 	for idx, seed := range seeds {
// 		picID, ok := users[seed.PicKey]
// 		if !ok {
// 			return fmt.Errorf("user %s not seeded", seed.PicKey)
// 		}

// 		var customer entity.Customer
// 		err := tx.Where("name = ?", seed.Name).First(&customer).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			customer = entity.Customer{
// 				Name:          seed.Name,
// 				PicId:         picID,
// 				Type:          string(utils.CustomerSupplierTypeBisnis),
// 				Address:       seed.Address,
// 				Phone:         seed.Phone,
// 				Email:         seed.Email,
// 				AccountNumber: *strPtr(fmt.Sprintf("%03d", idx+1)),
// 				CreatedBy:     createdBy,
// 			}
// 			if err := tx.Create(&customer).Error; err != nil {
// 				return err
// 			}
// 		} else if err != nil {
// 			return err
// 		}
// 	}

// 	return nil
// }

// func seedFcr(tx *gorm.DB, createdBy uint) (map[string]uint, error) {
// 	seeds := []struct {
// 		Name      string
// 		Standards []struct {
// 			Weight    float64
// 			FcrNumber float64
// 			Mortality float64
// 		}
// 	}{
// 		{
// 			Name: "FCR Layer",
// 			Standards: []struct {
// 				Weight    float64
// 				FcrNumber float64
// 				Mortality float64
// 			}{
// 				{Weight: 0.8, FcrNumber: 1.60, Mortality: 2.0},
// 				{Weight: 1.5, FcrNumber: 1.75, Mortality: 3.5},
// 			},
// 		},
// 	}

// 	result := make(map[string]uint, len(seeds))

// 	for _, seed := range seeds {
// 		var fcr entity.Fcr
// 		err := tx.Where("name = ?", seed.Name).First(&fcr).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			fcr = entity.Fcr{Name: seed.Name, CreatedBy: createdBy}
// 			if err := tx.Create(&fcr).Error; err != nil {
// 				return nil, err
// 			}
// 		} else if err != nil {
// 			return nil, err
// 		}
// 		result[seed.Name] = fcr.Id

// 		for _, std := range seed.Standards {
// 			var standard entity.FcrStandard
// 			err := tx.Where("fcr_id = ? AND weight = ?", fcr.Id, std.Weight).First(&standard).Error
// 			if errors.Is(err, gorm.ErrRecordNotFound) {
// 				standard = entity.FcrStandard{
// 					FcrID:     fcr.Id,
// 					Weight:    std.Weight,
// 					FcrNumber: std.FcrNumber,
// 					Mortality: std.Mortality,
// 				}
// 				if err := tx.Create(&standard).Error; err != nil {
// 					return nil, err
// 				}
// 			} else if err != nil {
// 				return nil, err
// 			} else {
// 				if err := tx.Model(&entity.FcrStandard{}).Where("id = ?", standard.Id).Updates(map[string]any{
// 					"fcr_number": std.FcrNumber,
// 					"mortality":  std.Mortality,
// 				}).Error; err != nil {
// 					return nil, err
// 				}
// 			}
// 		}
// 	}

// 	return result, nil
// }

// func seedProducts(tx *gorm.DB, createdBy uint, uoms map[string]uint, categories map[string]uint, suppliers map[string]uint) error {
// 	seeds := []struct {
// 		Name      string
// 		Brand     string
// 		Sku       string
// 		Uom       string
// 		Category  string
// 		Price     float64
// 		Selling   *float64
// 		Tax       *float64
// 		Expiry    *int
// 		Suppliers []string
// 		Flags     []utils.FlagType
// 	}{
// 		{
// 			Name:      "DOC Broiler",
// 			Brand:     "MBU Broiler",
// 			Sku:       "BRO0001",
// 			Uom:       "Ekor",
// 			Category:  "Day Old Chick",
// 			Price:     7500,
// 			Suppliers: []string{"PT CHAROEN POKPHAND INDONESIA Tbk"},
// 			Flags:     []utils.FlagType{utils.FlagDOC},
// 		},
// 		{
// 			Name:      "Ayam Pullet",
// 			Brand:     "MBU Pullet",
// 			Sku:       "PLT0001",
// 			Uom:       "Ekor",
// 			Category:  "Pullet",
// 			Price:     15000,
// 			Suppliers: []string{"PT CHAROEN POKPHAND INDONESIA Tbk"},
// 			Flags:     []utils.FlagType{utils.FlagPullet},
// 		},
// 		{
// 			Name:     "Ayam Afkir",
// 			Brand:    "-",
// 			Sku:      "1",
// 			Uom:      "Ekor",
// 			Category: "Day Old Chick",
// 			Price:    1,
// 			Flags:    []utils.FlagType{utils.FlagAyamAfkir},
// 		},
// 		{
// 			Name:     "Ayam Mati",
// 			Brand:    "-",
// 			Sku:      "2",
// 			Uom:      "Ekor",
// 			Category: "Day Old Chick",
// 			Price:    1,
// 			Flags:    []utils.FlagType{utils.FlagAyamMati},
// 		},
// 		{
// 			Name:     "Ayam Culling",
// 			Brand:    "-",
// 			Sku:      "3",
// 			Uom:      "Ekor",
// 			Category: "Day Old Chick",
// 			Price:    1,
// 			Flags:    []utils.FlagType{utils.FlagAyamCulling},
// 		},
// 		{
// 			Name:     "Telur Konsumsi Baik",
// 			Brand:    "-",
// 			Sku:      "4",
// 			Uom:      "Unit",
// 			Category: "Telur",
// 			Price:    1,
// 			Flags:    []utils.FlagType{utils.FlagTelurUtuh},
// 		},
// 		{
// 			Name:     "Telur Pecah",
// 			Brand:    "-",
// 			Sku:      "5",
// 			Uom:      "Unit",
// 			Category: "Telur",
// 			Price:    1,
// 			Flags:    []utils.FlagType{utils.FlagTelurPecah},
// 		},
// 		{
// 			Name:      "281 SPECIAL STARTER",
// 			Brand:     "281 STARTER",
// 			Sku:       "281",
// 			Uom:       "Kilogram",
// 			Category:  "Bahan Baku",
// 			Price:     7850,
// 			Expiry:    intPtr(60),
// 			Suppliers: []string{"PT CHAROEN POKPHAND INDONESIA Tbk"},
// 			Flags:     []utils.FlagType{utils.FlagPakan, utils.FlagStarter},
// 		},
// 		{
// 			Name:      "Ayam Layer",
// 			Brand:     "-",
// 			Sku:       "LYR0001",
// 			Uom:       "Ekor",
// 			Category:  "Pullet",
// 			Price:     20000,
// 			Suppliers: []string{"PT CHAROEN POKPHAND INDONESIA Tbk"},
// 			Flags:     []utils.FlagType{utils.FlagLayer},
// 		},
// 	}

// 	for _, seed := range seeds {
// 		uomID, ok := uoms[seed.Uom]
// 		if !ok {
// 			return fmt.Errorf("uom %s not seeded", seed.Uom)
// 		}
// 		categoryID, ok := categories[seed.Category]
// 		if !ok {
// 			return fmt.Errorf("product category %s not seeded", seed.Category)
// 		}

// 		var product entity.Product
// 		err := tx.Where("name = ?", seed.Name).First(&product).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			selling := seed.Selling
// 			tax := seed.Tax
// 			product = entity.Product{
// 				Name:              seed.Name,
// 				Brand:             seed.Brand,
// 				Sku:               &seed.Sku,
// 				UomId:             uomID,
// 				ProductCategoryId: categoryID,
// 				ProductPrice:      seed.Price,
// 				SellingPrice:      selling,
// 				Tax:               tax,
// 				ExpiryPeriod:      seed.Expiry,
// 				CreatedBy:         createdBy,
// 			}
// 			if err := tx.Create(&product).Error; err != nil {
// 				return err
// 			}
// 		} else if err != nil {
// 			return err
// 		} else {
// 			updates := map[string]any{
// 				"brand":               seed.Brand,
// 				"uom_id":              uomID,
// 				"product_category_id": categoryID,
// 				"product_price":       seed.Price,
// 				"selling_price":       seed.Selling,
// 				"tax":                 seed.Tax,
// 				"expiry_period":       seed.Expiry,
// 			}
// 			if seed.Sku != "" {
// 				updates["sku"] = seed.Sku
// 			}
// 			if err := tx.Model(&entity.Product{}).Where("id = ?", product.Id).Updates(updates).Error; err != nil {
// 				return err
// 			}
// 		}

// 		for _, supplierName := range seed.Suppliers {
// 			supplierID, ok := suppliers[supplierName]
// 			if !ok {
// 				return fmt.Errorf("supplier %s not seeded", supplierName)
// 			}
// 			var existing entity.ProductSupplier
// 			err := tx.Where("product_id = ? AND supplier_id = ?", product.Id, supplierID).First(&existing).Error
// 			if errors.Is(err, gorm.ErrRecordNotFound) {
// 				link := entity.ProductSupplier{ProductId: product.Id, SupplierId: supplierID}
// 				if err := tx.Create(&link).Error; err != nil {
// 					return err
// 				}
// 			} else if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
// 				return err
// 			}
// 		}

// 		if err := seedFlags(tx, product.Id, entity.FlagableTypeProduct, seed.Flags); err != nil {
// 			return err
// 		}
// 	}

// 	return nil
// }

// func seedNonstocks(tx *gorm.DB, createdBy uint, uoms map[string]uint, suppliers map[string]uint) error {
// 	seeds := []struct {
// 		Name      string
// 		Uom       string
// 		Suppliers []string
// 		Flags     []utils.FlagType
// 	}{
// 		{
// 			Name:      "Expedisi DOC",
// 			Uom:       "Ekor",
// 			Suppliers: []string{"Ekspedisi"},
// 			Flags:     []utils.FlagType{utils.FlagEkspedisi},
// 		},
// 		{
// 			Name:      "Solar",
// 			Uom:       "Liter",
// 			Suppliers: []string{"BOP Vendor"},
// 			Flags:     []utils.FlagType{},
// 		},
// 	}

// 	for _, seed := range seeds {
// 		uomID, ok := uoms[seed.Uom]
// 		if !ok {
// 			return fmt.Errorf("uom %s not seeded", seed.Uom)
// 		}

// 		var nonstock entity.Nonstock
// 		err := tx.Where("name = ?", seed.Name).First(&nonstock).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			nonstock = entity.Nonstock{
// 				Name:      seed.Name,
// 				UomId:     uomID,
// 				CreatedBy: createdBy,
// 			}
// 			if err := tx.Create(&nonstock).Error; err != nil {
// 				return err
// 			}
// 		} else if err != nil {
// 			return err
// 		} else {
// 			if err := tx.Model(&entity.Nonstock{}).Where("id = ?", nonstock.Id).Updates(map[string]any{
// 				"uom_id": uomID,
// 			}).Error; err != nil {
// 				return err
// 			}
// 		}

// 		for _, supplierName := range seed.Suppliers {
// 			supplierID, ok := suppliers[supplierName]
// 			if !ok {
// 				return fmt.Errorf("supplier %s not seeded", supplierName)
// 			}
// 			var existing entity.NonstockSupplier
// 			err := tx.Where("nonstock_id = ? AND supplier_id = ?", nonstock.Id, supplierID).First(&existing).Error
// 			if errors.Is(err, gorm.ErrRecordNotFound) {
// 				link := entity.NonstockSupplier{NonstockId: nonstock.Id, SupplierId: supplierID}
// 				if err := tx.Create(&link).Error; err != nil {
// 					return err
// 				}
// 			} else if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
// 				return err
// 			}
// 		}

// 		if err := seedFlags(tx, nonstock.Id, entity.FlagableTypeNonstock, seed.Flags); err != nil {
// 			return err
// 		}
// 	}

// 	return nil
// }

// // nanti saya isi

// func seedFlags(tx *gorm.DB, flagableID uint, flagableType string, flags []utils.FlagType) error {
// 	if len(flags) == 0 {
// 		return nil
// 	}
// 	for _, flag := range flags {
// 		name := strings.ToUpper(string(flag))
// 		var existing entity.Flag
// 		err := tx.Where("name = ? AND flagable_id = ? AND flagable_type = ?", name, flagableID, flagableType).First(&existing).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			record := entity.Flag{
// 				Name:         name,
// 				FlagableID:   flagableID,
// 				FlagableType: flagableType,
// 			}
// 			if err := tx.Create(&record).Error; err != nil {
// 				return err
// 			}
// 		} else if err != nil {
// 			return err
// 		}
// 	}
// 	return nil
// }

// func seedBanks(tx *gorm.DB, createdBy uint) error {
// 	seeds := []struct {
// 		Name          string
// 		Alias         string
// 		Owner         *string
// 		AccountNumber string
// 	}{
// 		{
// 			Name:          "Bank Central Asia",
// 			Alias:         "BCA",
// 			AccountNumber: "1234567890",
// 			Owner:         ptr("PT MBU Group"),
// 		},
// 		{
// 			Name:          "Bank Rakyat Indonesia",
// 			Alias:         "BRI",
// 			AccountNumber: "9876543210",
// 			Owner:         ptr("PT MBU Group"),
// 		},
// 		{
// 			Name:          "Bank Mandiri",
// 			Alias:         "MAND",
// 			AccountNumber: "1122334455",
// 			Owner:         ptr("PT MBU Group"),
// 		},
// 	}

// 	for _, seed := range seeds {
// 		var bank entity.Bank
// 		err := tx.Where("name = ?", seed.Name).First(&bank).Error

// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			bank = entity.Bank{
// 				Name:          seed.Name,
// 				Alias:         seed.Alias,
// 				Owner:         seed.Owner,
// 				AccountNumber: seed.AccountNumber,
// 				CreatedBy:     createdBy,
// 				CreatedAt:     time.Now(),
// 				UpdatedAt:     time.Now(),
// 			}
// 			if err := tx.Create(&bank).Error; err != nil {
// 				return err
// 			}
// 		} else if err != nil {
// 			return err
// 		} else {
// 			// update data jika sudah ada
// 			if err := tx.Model(&entity.Bank{}).Where("id = ?", bank.Id).Updates(map[string]any{
// 				"alias":          seed.Alias,
// 				"owner":          seed.Owner,
// 				"account_number": seed.AccountNumber,
// 				"updated_at":     time.Now(),
// 			}).Error; err != nil {
// 				return err
// 			}
// 		}
// 	}

// 	return nil
// }

// func seedProductWarehouse(tx *gorm.DB, createdBy uint) error {
// 	seeds := []struct {
// 		ProductName   string
// 		WarehouseName string
// 		Quantity      float64
// 	}{
// 		{ProductName: "DOC Broiler", WarehouseName: "Gudang Priangan", Quantity: 0},
// 		{ProductName: "281 SPECIAL STARTER", WarehouseName: "Gudang Singaparna", Quantity: 0},
// 		{ProductName: "281 SPECIAL STARTER", WarehouseName: "Gudang Banten", Quantity: 0},
// 		{ProductName: "DOC Broiler", WarehouseName: "Gudang Singaparna 1", Quantity: 0},
// 		{ProductName: "Telur Konsumsi Baik", WarehouseName: "Gudang Singaparna 1", Quantity: 0},
// 		{ProductName: "Telur Pecah", WarehouseName: "Gudang Singaparna 1", Quantity: 0},
// 		{ProductName: "Telur Konsumsi Baik", WarehouseName: "Gudang Cikaum 1", Quantity: 0},
// 		{ProductName: "Telur Pecah", WarehouseName: "Gudang Cikaum 1", Quantity: 0},
// 	}

// 	for _, seed := range seeds {
// 		var product entity.Product
// 		if err := tx.Where("name = ?", seed.ProductName).First(&product).Error; err != nil {
// 			if errors.Is(err, gorm.ErrRecordNotFound) {
// 				return fmt.Errorf("product %q not found for product warehouse seeding", seed.ProductName)
// 			}
// 			return err
// 		}

// 		var warehouse entity.Warehouse
// 		if err := tx.Where("name = ?", seed.WarehouseName).First(&warehouse).Error; err != nil {
// 			if errors.Is(err, gorm.ErrRecordNotFound) {
// 				return fmt.Errorf("warehouse %q not found for product warehouse seeding", seed.WarehouseName)
// 			}
// 			return err
// 		}

// 		var productWarehouse entity.ProductWarehouse
// 		err := tx.Where("product_id = ? AND warehouse_id = ?", product.Id, warehouse.Id).First(&productWarehouse).Error
// 		if errors.Is(err, gorm.ErrRecordNotFound) {
// 			productWarehouse = entity.ProductWarehouse{
// 				ProductId:   product.Id,
// 				WarehouseId: warehouse.Id,
// 				Quantity:    seed.Quantity,
// 				// CreatedBy:   createdBy,
// 			}
// 			if err := tx.Create(&productWarehouse).Error; err != nil {
// 				return err
// 			}
// 		} else if err != nil {
// 			return err
// 		} else {
// 			if err := tx.Model(&productWarehouse).Updates(map[string]any{
// 				"quantity": seed.Quantity,
// 			}).Error; err != nil {
// 				return err
// 			}
// 		}
// 	}

// 	return nil
// }

// func seedTransferStock(tx *gorm.DB) error {

// 	transfer := entity.StockTransfer{
// 		FromWarehouseId: 1,
// 		ToWarehouseId:   2,
// 		Reason:          "Seed transfer stock",
// 		TransferDate:    time.Now(),
// 		MovementNumber:  "SEED-TRF-00001",
// 		CreatedBy:       1,
// 	}
// 	if err := tx.Create(&transfer).Error; err != nil {
// 		return err
// 	}

// 	details := []entity.StockTransferDetail{
// 		{
// 			StockTransferId: transfer.Id,
// 			ProductId:       1,

// 			SourceProductWarehouseID: func() *uint64 { id := uint64(1); return &id }(),
// 			DestProductWarehouseID:   func() *uint64 { id := uint64(2); return &id }(),
// 			UsageQty:                 10,
// 			PendingQty:               0,
// 			TotalQty:                 10,
// 			TotalUsed:                0,
// 		},
// 		{
// 			StockTransferId: transfer.Id,
// 			ProductId:       2,

// 			SourceProductWarehouseID: func() *uint64 { id := uint64(1); return &id }(),
// 			DestProductWarehouseID:   func() *uint64 { id := uint64(2); return &id }(),
// 			UsageQty:                 5,
// 			PendingQty:               0,
// 			TotalQty:                 5,
// 			TotalUsed:                0,
// 		},
// 	}
// 	for i := range details {
// 		if err := tx.Create(&details[i]).Error; err != nil {
// 			return err
// 		}
// 	}

// 	deliveries := []entity.StockTransferDelivery{
// 		{
// 			StockTransferId:   transfer.Id,
// 			SupplierId:        1,
// 			VehiclePlate:      "B 1234 XYZ",
// 			DriverName:        "Driver Seed",
// 			DocumentPath:      "seed.pdf",
// 			ShippingCostItem:  1000,
// 			ShippingCostTotal: 2000,
// 		},
// 	}
// 	for i := range deliveries {
// 		if err := tx.Create(&deliveries[i]).Error; err != nil {
// 			return err
// 		}
// 	}

// 	detailMap := make(map[uint64]uint64)
// 	for _, d := range details {
// 		detailMap[d.ProductId] = d.Id
// 	}

// 	deliveryItems := []entity.StockTransferDeliveryItem{
// 		{
// 			StockTransferDeliveryId: deliveries[0].Id,
// 			StockTransferDetailId:   detailMap[1],
// 			Quantity:                50,
// 		},
// 		{
// 			StockTransferDeliveryId: deliveries[0].Id,
// 			StockTransferDetailId:   detailMap[2],
// 			Quantity:                30,
// 		},
// 	}
// 	for i := range deliveryItems {
// 		if err := tx.Create(&deliveryItems[i]).Error; err != nil {
// 			return err
// 		}
// 	}

// 	return nil
// }
// func ptr[T any](v T) *T {
// 	return &v
// }

// func strPtr(s string) *string {
// 	return &s
// }

// func intPtr(v int) *int {
// 	return &v
// }

// func uintPtr(v uint) *uint {
// 	return &v
// }
