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 := processAGShocks(outDir); err != nil {
		log.Printf("AG Shock error: %v", err)
	}

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

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

	fmt.Println("AG conversion completed")
}

func processAGShocks(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
	}

	csvFile := filepath.Join(outDir, "ag_shock.csv")
	file, err := os.Create(csvFile)
	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("AG Shock: %d rows exported to ag_shock.csv\n", count)
	return nil
}

func processAGStruts(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
	}

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

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

	writer.Write([]string{"codigo", "syd", "vazlo", "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]),
			"SYD", "Vazlo",
			marca,
			marca + " " + modelo,
			strconv.Itoa(year),
			strconv.Itoa(year),
			cleanStr(row[18]),
			cleanStr(row[13]),
		})
		count++
	}
	writer.Flush()
	fmt.Printf("AG Strut: %d rows exported to ag_strut.csv\n", count)
	return nil
}

func processAGLegs(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
	}

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

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

	writer.Write([]string{"codigo", "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]),
			"AG Proshock",
			marca + " " + modelo,
			strconv.Itoa(year),
			strconv.Itoa(year),
			cleanStr(row[18]),
			cleanStr(row[13]),
		})
		count++
	}
	writer.Flush()
	fmt.Printf("AG Leg: %d rows exported to ag_leg.csv\n", count)
	return nil
}

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