package csvimporter

import (
	"context"
	"fmt"

	"catalogue.midpdsa.com/src/db/catalogue"
	"github.com/jackc/pgx/v5/pgtype"
)

func (imp *Importer) ImportCanoDisk(filename string) (ImportResult, error) {
	result := ImportResult{Table: "disk_brand_specs"}

	records, err := imp.readCSVSeparator(filename, '|')
	if err != nil {
		return result, fmt.Errorf("failed to read CSV: %w", err)
	}

	if len(records) < 2 {
		return result, fmt.Errorf("no data rows in CSV")
	}

	ctx := context.Background()

	header := records[0]
	headerMap := make(map[string]int)
	for i, col := range header {
		headerMap[normalizeHeaderKey(col)] = i
	}

	var errorRows []ErrorRow

	for i, row := range records[1:] {
		rowNum := i + 2

		get := func(key string) string {
			idx, ok := headerMap[normalizeHeaderKey(key)]
			if !ok || idx >= len(row) {
				return ""
			}
			return row[idx]
		}

		partNumber := get("partNumber")
		mipPartNumber := get("mipPartNumber")
		product := get("product")
		description := get("description")
		prodType := get("type")
		position := get("position")
		minThikness := get("minThikness")
		ogDiameter := get("ogDiameter")
		maxDiameter := get("maxDiameter")
		height := get("height")
		piDiameter := get("piDiameter")
		materials := get("materials")
		lugNuts := get("lugNuts")
		vehicleAttrs := get("vehicleAttrs")
		categoria := get("Categoría")
		make := get("make")
		model := get("model")
		year := get("year")
		yearRange := get("yearRange")

		if partNumber == "" || partNumber == "MISSING" {
			result.Errors++
			errorRows = append(errorRows, ErrorRow{Row: row, Error: "Missing partNumber", RowNum: rowNum})
			continue
		}

		if make == "" || make == "MISSING" || model == "" || model == "MISSING" {
			result.Errors++
			errorRows = append(errorRows, ErrorRow{Row: row, Error: "Missing make or model", RowNum: rowNum})
			continue
		}

		vehicleTypeName := "Ligero"
		if categoria != "" && categoria != "MISSING" {
			vehicleTypeName = categoria
		}

		vehicleTypeID, err := imp.findOrCreateVehicleType(ctx, vehicleTypeName)
		if err != nil {
			result.Errors++
			errorRows = append(errorRows, ErrorRow{Row: row, Error: fmt.Sprintf("Failed to find/create vehicle type: %v", err), RowNum: rowNum})
			continue
		}

		modelYearID, err := imp.findOrCreateVehicleModelYear(ctx, make, model, vehicleTypeID)
		if err != nil {
			result.Errors++
			errorRows = append(errorRows, ErrorRow{Row: row, Error: fmt.Sprintf("Failed to find/create vehicle model year: %v", err), RowNum: rowNum})
			continue
		}

		diskBrandID, err := imp.findOrCreateDiskBrand(ctx, "Cano")
		if err != nil {
			result.Errors++
			errorRows = append(errorRows, ErrorRow{Row: row, Error: fmt.Sprintf("Failed to find/create disk brand: %v", err), RowNum: rowNum})
			continue
		}

		if err := imp.insertDiskBrandSpec(ctx, catalogue.CreateDiskBrandSpecParams{
			PartNumber:             pgtype.Text{String: partNumber, Valid: true},
			MipPartNumber:          pgtype.Text{String: mipPartNumber, Valid: mipPartNumber != "" && mipPartNumber != "MISSING"},
			Product:                pgtype.Text{String: product, Valid: product != "" && product != "MISSING"},
			Serie:                  pgtype.Text{Valid: false},
			Tier:                   pgtype.Text{Valid: false},
			Quantity:               pgtype.Int4{Int32: 1, Valid: true},
			Position:               pgtype.Text{String: position, Valid: position != "" && position != "MISSING"},
			Description:            pgtype.Text{String: description, Valid: description != "" && description != "MISSING"},
			Type:                   pgtype.Text{String: prodType, Valid: prodType != "" && prodType != "MISSING"},
			MinThikness:            pgtype.Text{String: minThikness, Valid: minThikness != "" && minThikness != "MISSING"},
			LugNuts:                pgtype.Text{String: lugNuts, Valid: lugNuts != "" && lugNuts != "MISSING"},
			OgDiameter:             pgtype.Text{String: ogDiameter, Valid: ogDiameter != "" && ogDiameter != "MISSING"},
			MaxDiameter:            pgtype.Text{String: maxDiameter, Valid: maxDiameter != "" && maxDiameter != "MISSING"},
			Materials:              pgtype.Text{String: materials, Valid: materials != "" && materials != "MISSING"},
			PiDiameter:             pgtype.Text{String: piDiameter, Valid: piDiameter != "" && piDiameter != "MISSING"},
			Height:                 pgtype.Text{String: height, Valid: height != "" && height != "MISSING"},
			IncludesHardware:       pgtype.Text{String: lugNuts, Valid: lugNuts != "" && lugNuts != "MISSING"},
			ImageProduct:           pgtype.Text{},
			VehicleAttrs:           pgtype.Text{String: vehicleAttrs, Valid: vehicleAttrs != "" && vehicleAttrs != "MISSING"},
			ImageProductDimentions: pgtype.Text{},
			TechnicalSheet:         pgtype.Text{},
			FkIdVehicleModelYear:   pgtype.Int4{Int32: modelYearID, Valid: true},
			FkIdDiskBrand:          pgtype.Int4{Int32: diskBrandID, Valid: true},
			Years:                  pgtype.Text{String: year, Valid: year != "" && year != "MISSING"},
			YearsRange:             pgtype.Text{String: yearRange, Valid: yearRange != "" && yearRange != "MISSING"},
		}, &result); err != nil {
			result.Errors++
			errorRows = append(errorRows, ErrorRow{Row: row, Error: fmt.Sprintf("Database insert failed: %v", err), RowNum: rowNum})
			continue
		}

		if i%100 == 0 {
			fmt.Printf("  Cano Disk: %d rows processed\n", i)
		}
	}

	if len(errorRows) > 0 {
		err = imp.writeErrorCSV("cano_disk_errors.csv", header, errorRows)
		if err != nil {
			fmt.Printf("  Warning: failed to write error CSV: %v\n", err)
		}
	}

	return result, nil
}
