package xlstranslator

import (
	"encoding/csv"
	"encoding/xml"
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

// ACES XML structures
type ACESApp struct {
	XMLName         xml.Name `xml:"App"`
	BaseVehicle     string   `xml:"BaseVehicle"`
	SubModel        string   `xml:"SubModel"`
	Qty             string   `xml:"Qty"`
	PartTerminology string   `xml:"PartTerminology"`
	MfrLabel        string   `xml:"MfrLabel"`
	Position        string   `xml:"Position"`
	PartNumber      string   `xml:"PartNumber"`
}

// bremboAllowedPartNumbers is the explicit allowlist of Brembo part numbers
// the user wants imported. Only these PartNumbers will be written to brembo.csv.
var bremboAllowedPartNumbers = map[string]bool{
	// Existing Brembo wear-sensor part numbers.
	"A00206": true, "A00207": true, "A00245": true, "A00247": true,
	"A00274": true, "A00277": true, "A00286": true, "A00287": true, "A00288": true,
	"A00353": true, "A00354": true, "A00377": true, "A00432": true, "A00433": true,
	"A00434": true, "A00438": true, "A00442": true, "A00447": true, "A00452": true,
	"A00455": true, "A00473": true, "A00474": true, "A00484": true, "A00486": true,
	"A00494": true, "A00498": true, "A00506": true, "A00507": true, "A00509": true,
	"A00524": true,
	// Pads, shoes, drums, and rotors requested for import (2026-07-30).
	"P06033": true, "P06033N": true, "P06034X": true, "P06051X": true, "P06052X": true,
	"P06054X": true, "P06058": true, "P06060N": true, "P06070X": true, "P06071X": true,
	"P06088N": true, "P06099N": true, "P10004N": true, "P11007N": true, "P24048N": true,
	"P28051N": true, "P34005N": true, "P34007N": true, "P50120N": true, "P50122N": true,
	"P50146": true, "P50159": true, "P54038": true, "P59042N": true, "P65027": true,
	"P65033N": true, "P68027N": true, "P83153N": true, "P85073X": true, "P85076N": true,
	"P85099N": true, "P85112X": true, "P85113N": true, "P85137X": true, "P85145N": true,
	"P85166": true, "P86023N": true, "P86027N": true, "P86034": true,
	"08.A202.11": true, "08.B347.41": true, "08.B602.10": true, "08.N233.11": true,
	"09.4765.10": true, "09.5253.10": true, "09.9167.1X": true, "09.9508.10": true,
	"09.9772.75": true, "09.A200.10": true, "09.A958.11": true, "09.A961.21": true,
	"09.B063.10": true, "09.B338.11": true, "09.B635.11": true, "09.C133.11": true,
	"09.C351.11": true, "09.C500.11": true, "09.C743.11": true, "09.C937.11": true,
	"09.D094.13": true, "09.D179.21": true, "09.D424.11": true, "09.N236.21": true,
	"09.N246.21": true, "09.N247.11": true,
	"S10514": true, "S24540": true, "S30525": true, "S50504": true, "S56510": true,
	"S61520": true, "S61525": true, "S85516": true, "S85541": true,
	"14.4978.10": true,
}

// processBremboXML reads the ACES XML and outputs brembo.csv filtered to the
// allowed part numbers. It emits a warning for any allowed part number that is
// not present in the source file.
func (c *Converter) processBremboXML(fp string) error {
	outDir := c.cfg.OutputDir

	file, err := os.Open(fp)
	if err != nil {
		return fmt.Errorf("failed to open XML file: %w", err)
	}
	defer file.Close()

	outFile, err := os.Create(filepath.Join(outDir, "brembo.csv"))
	if err != nil {
		return fmt.Errorf("failed to create CSV file: %w", err)
	}
	defer outFile.Close()

	writer := csv.NewWriter(outFile)
	writer.Comma = '|'
	writer.Write([]string{"numero_de_parte", "producto", "tipo", "aplicacion", "fmsi", "posicion"})
	writer.Flush()

	decoder := xml.NewDecoder(file)
	rowCount := 0
	found := make(map[string]bool)

	for {
		token, err := decoder.Token()
		if err != nil {
			break
		}

		se, ok := token.(xml.StartElement)
		if !ok || se.Name.Local != "App" {
			continue
		}

		var app ACESApp
		if err := decoder.DecodeElement(&app, &se); err != nil {
			c.logError(fp, "", rowCount, "", fmt.Sprintf("XML decode error: %v", err))
			continue
		}

		if app.PartNumber == "" {
			c.logError(fp, "", rowCount, app.BaseVehicle, "missing PartNumber in App element")
			continue
		}

		if !bremboAllowedPartNumbers[app.PartNumber] {
			continue
		}
		found[app.PartNumber] = true

		writer.Write([]string{
			app.PartNumber,
			app.PartTerminology,
			app.MfrLabel,
			app.BaseVehicle,
			"",
			app.Position,
		})
		rowCount++
		if rowCount%1000 == 0 {
			fmt.Printf("    Processed %d rows...\n", rowCount)
		}
	}

	writer.Flush()

	var missing []string
	for pn := range bremboAllowedPartNumbers {
		if !found[pn] {
			missing = append(missing, pn)
		}
	}
	if len(missing) > 0 {
		fmt.Printf("  Warning: the following allowed part numbers were not found in %s: %s\n", filepath.Base(fp), strings.Join(missing, ", "))
	}

	fmt.Printf("Exported: brembo.csv (%d rows)\n", rowCount)
	return nil
}

// parseBremboBaseVehicle parses "Make - Model - Year" into components.
func parseBremboBaseVehicle(baseVehicle string) (make, model, year string) {
	parts := strings.Split(baseVehicle, " - ")
	if len(parts) >= 3 {
		make = strings.TrimSpace(parts[0])
		model = strings.TrimSpace(parts[1])
		year = strings.TrimSpace(parts[2])
	} else if len(parts) == 2 {
		make = strings.TrimSpace(parts[0])
		model = strings.TrimSpace(parts[1])
	} else if len(parts) == 1 {
		make = strings.TrimSpace(parts[0])
	}
	return
}
