package main

import (
	"encoding/csv"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"regexp"
	"strconv"
	"strings"

	"github.com/xuri/excelize/v2"
)

func main() {
	outDir := "../../docs/database/csv"
	if err := os.MkdirAll(outDir, 0755); err != nil {
		log.Fatal(err)
	}

	if err := processGRCShocks(outDir); err != nil {
		log.Printf("Shocks error: %v", err)
	}

	if err := processGRCBrakes(outDir); err != nil {
		log.Printf("Brakes error: %v", err)
	}

	fmt.Println("GRC conversion completed")
}

func processGRCShocks(outDir string) error {
	fp := "../../../../docs/database/amort-deseable.xlsx"
	f, err := excelize.OpenFile(fp)
	if err != nil {
		return err
	}
	defer f.Close()

	rows, err := f.GetRows("GRC Web Cat")
	if err != nil {
		return err
	}

	shockFile := filepath.Join(outDir, "grc_shock.csv")
	file, err := os.Create(shockFile)
	if err != nil {
		return err
	}
	defer file.Close()

	writer := csv.NewWriter(file)
	writer.Comma = ';'

	writer.Write([]string{"codigo", "kyb", "boge", "marca", "aplicacion", "desde", "hasta", "pos", "img_url"})
	writer.Flush()

	count := 0
	for i, row := range rows {
		if i == 0 || len(row) < 12 {
			continue
		}

		marca := cleanStr(row[1])
		modelo := cleanStr(row[2])
		if marca == "" || modelo == "" {
			continue
		}

		yearStr := cleanStr(row[3])
		year, _ := strconv.Atoi(yearStr)
		if year == 0 {
			year = 2025
		}

		writer.Write([]string{
			cleanStr(row[4]),
			"",
			"",
			marca,
			marca + " " + modelo,
			strconv.Itoa(year),
			strconv.Itoa(year),
			cleanStr(row[18]),
			cleanStr(row[13]),
		})
		count++
	}
	writer.Flush()
	fmt.Printf("GRC shocks: %d rows exported to grc_shock.csv\n", count)
	return nil
}

func processGRCBrakes(outDir string) error {
	fp := "../../../../docs/database/frenos-deseable.xlsx"
	f, err := excelize.OpenFile(fp)
	if err != nil {
		return err
	}
	defer f.Close()

	rows, err := f.GetRows("GRC Ultra & Prime Database")
	if err != nil {
		return err
	}

	brakeFile := filepath.Join(outDir, "grc_brake.csv")
	file, err := os.Create(brakeFile)
	if err != nil {
		return err
	}
	defer file.Close()

	writer := csv.NewWriter(file)
	writer.Comma = ';'

	writer.Write([]string{"no_parte", "producto", "aplicacion", "fmsi"})
	writer.Flush()

	count := 0
	for i, row := range rows {
		if i == 0 || len(row) < 8 {
			continue
		}

		marca := cleanStr(row[0])
		modelo := cleanStr(row[1])
		ano := cleanStr(row[2])
		if marca == "" || modelo == "" {
			continue
		}

		aplicacion := marca + " " + modelo
		if ano != "" {
			aplicacion += " " + ano
		}

		writer.Write([]string{
			cleanStr(row[3]),
			cleanStr(row[4]),
			aplicacion,
			cleanStr(row[7]),
		})
		count++
	}
	writer.Flush()
	fmt.Printf("GRC brakes: %d rows exported to grc_brake.csv\n", count)
	return nil
}

func cleanStr(s string) string {
	s = strings.TrimSpace(s)
	s = regexp.MustCompile(`\s+`).ReplaceAllString(s, " ")
	return s
}