package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"path/filepath"

	csvimporter "catalogue.midpdsa.com/modules/csv"
	"catalogue.midpdsa.com/src/db/catalogue"
	"github.com/jackc/pgx/v5"
)

const csvDir = "/app/docs/database/csv"

func runSource(imp *csvimporter.Importer, source string) (csvimporter.ImportResult, error) {
	switch source {
	case "ag-shock":
		return imp.ImportAGShock(filepath.Join(csvDir, "AG_shock.csv"))
	case "ag-strut":
		return imp.ImportAGStrut(filepath.Join(csvDir, "AG_strut.csv"))
	case "ag-leg":
		return imp.ImportAGLeg(filepath.Join(csvDir, "AG_leg.csv"))
	case "monroe-ld":
		return imp.ImportMonroeLD(filepath.Join(csvDir, "monroe_ld.csv"))
	case "monroe-hd":
		return imp.ImportMonroeHD(filepath.Join(csvDir, "monroe_hd.csv"))
	case "trw-sachs":
		return imp.ImportTRWSachs(filepath.Join(csvDir, "trw_sachs.csv"))
	case "wagner":
		return imp.ImportWagner(filepath.Join(csvDir, "wagner_brake.csv"))
	case "grobb":
		return imp.ImportGrobb(filepath.Join(csvDir, "grobb_shocks.csv"))
	case "fritec":
		return imp.ImportFritec(filepath.Join(csvDir, "fritec_discs.csv"))
	case "brembo":
		return imp.ImportBrembo(filepath.Join(csvDir, "brembo.csv"))
	case "prestone":
		return imp.ImportPrestone(filepath.Join(csvDir, "prestone.csv"))
	case "pagid-brake":
		return imp.ImportPagidBrake(filepath.Join(csvDir, "pagid_brakes.csv"))
	case "pagid-disk":
		return imp.ImportPagidDisk(filepath.Join(csvDir, "pagid_discs.csv"))
	case "pagid-sensor":
		return imp.ImportPagidSensor(filepath.Join(csvDir, "pagid_sensors.csv"))
	case "cano", "cano-disk":
		return imp.ImportCanoDisk(filepath.Join(csvDir, "cano_disk.csv"))
	case "grc-brakes":
		return imp.ImportGRCBrakes(filepath.Join(csvDir, "frenos-deseable.csv"))
	case "grc-shocks":
		return imp.ImportGRCShocksHeavy(filepath.Join(csvDir, "amort-deseable.csv"))
	case "grc-shocks-ligero":
		return imp.ImportGRCShocks(filepath.Join(csvDir, "grc-ligro-amort-deseable.csv"))
	default:
		return csvimporter.ImportResult{}, fmt.Errorf("unknown import source: %s", source)
	}
}

func main() {
	if len(os.Args) < 2 {
		log.Fatalf("usage: go run cmd/import/main.go <source>\nsources: ag-shock, ag-strut, ag-leg, monroe-ld, monroe-hd, trw-sachs, wagner, grobb, fritec, brembo, prestone, cano-disk, grc-brakes, grc-shocks, grc-shocks-ligero, pagid-brake, pagid-disk, pagid-sensor")
	}
	source := os.Args[1]

	ctx := context.Background()
	connStr := os.Getenv("MIP_DB")
	if connStr == "" {
		connStr = "postgres://user:password@localhost:5432/mydatabase?sslmode=disable"
	}

	conn, err := pgx.Connect(ctx, connStr)
	if err != nil {
		log.Fatalf("Unable to connect to database: %v\n", err)
	}
	defer conn.Close(ctx)

	queries := catalogue.New(conn)
	importer := csvimporter.NewImporter(queries)

	fmt.Printf("Importing source '%s'...\n", source)
	result, err := runSource(importer, source)
	if err != nil {
		log.Fatalf("Import failed: %v\n", err)
	}

	fmt.Printf("Done. Table: %s | Inserted: %d | Errors: %d\n", result.Table, result.Inserted, result.Errors)
}
