package srv

import (
	"bordrobot/lib/bot"
	"bordrobot/lib/company"
	"bordrobot/lib/run"
	"fmt"
	"log/slog"
	"strings"

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

type Srv struct {
	xlsFileName string
}

func (s *Srv) Companies() ([]company.Company, error) {
	slog.Info("Companies method called from JS")
	res := make([]company.Company, 0)
	err := run.DB.Select(&res, "SELECT * FROM company order by 1")
	if err != nil {
		slog.Error("Companies SELECT error", "error", err)
	} else {
		slog.Info("Companies SELECT success", "count", len(res), "data", res)
	}
	return res, err
}

func (s *Srv) CreateCompany(name, memberNumber, username, password string) error {
	c := &company.Company{
		Name:         name,
		MemberNumber: memberNumber,
		Username:     username,
		Password:     password,
	}

	err := c.Create()
	if err != nil {
		slog.Error("CreateCompany INSERT error", "error", err)
	} else {
		slog.Info("CreateCompany INSERT success", "name", name)
	}
	return err
}
func (s *Srv) EditCompany(id float64, name, memberNumber, username, password string) error {
	c := &company.Company{
		Id:           int(id),
		Name:         name,
		MemberNumber: memberNumber,
		Username:     username,
		Password:     password,
	}

	return c.Edit()
}

func (s *Srv) UploadExcel() string {
	dialog := run.APP.Dialog.OpenFile()
	// dialog.AddFilter("Excel Dosyaları", "*.xls;*.xlsx;*.ods")
	dialog.AddFilter("Excel 97-2003", "*.xls")
	dialog.AddFilter("Excel 2007+", "*.xlsx")
	dialog.AddFilter("LibreOffice Calc", "*.ods")

	dialog.SetTitle("Bordro Excel Dosyası Yükleme")
	file, err := dialog.PromptForSingleSelection()
	if err != nil {
		return ""
	}
	s.xlsFileName = file
	return file
}

type userInfo struct {
	userName  string
	password  string
	accountNo string
}

func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) error {
	type CompanyInfo struct {
		company *company.Company // float64.Company türünü gömme
		month   float64          // yeni bir alan ekliyoruz
		year    float64
	}
	user, err := company.GetCompany(companyID)
	if err != nil {
		return err
	}
	// companyInfo := CompanyInfo{
	// 	company: &user,
	// 	month:   month,
	// 	year:    year,
	// }

	//todo: readb company details by name
	b := bot.NewLucaBot(devMode)
	emitLog("Aktarım Başladı")
	err = b.Login(user, month, year)
	if err != nil {
		//todo: inform user about process and errors
		emitLog("Şifreniz Hatalı")
		return nil
	}
	err = b.PayrollPageLogin()
	slog.Debug("inputs", "year", year, "month", month)

	f, err := excelize.OpenFile(s.xlsFileName)
	if err != nil {
		slog.Error(err.Error())
		return err
	}
	defer func() {
		// Close the spreadsheet.
		if err := f.Close(); err != nil {
			slog.Error(err.Error())
			//return err
		}
	}()

	sheets := f.GetSheetList()
	rows, err := f.GetRows(sheets[0])
	fmt.Println(rows)
	if err != nil {
		slog.Error(err.Error())
		return err
	}
	if len(rows) < 3 {
		emitLog("Boş Excel Yüklemesi")
		b.ClosingBrowserFromExternalLink()
		return nil
	}
	// if rows[0][0] == "" {
	// 	rows = rows[1:]
	// }
	// type hashtagValue struct {
	// 	B string
	// 	N string
	// 	G string
	// 	S string
	// }
	// checkHeader := make(map[string]*hashtagValue)

	// for _, col := range rows[0] {
	// 	if strings.Contains(col, "Cagatay") {
	// 		fmt.Print("deneme")
	// 	}
	// 	var keySplitOne string
	// 	hs := &hashtagValue{
	// 		B: "",
	// 		N: "",
	// 		G: "",
	// 		S: "",
	// 	}
	// 	key := col
	// 	if strings.Contains(col, "#") {
	// 		keySplit := strings.SplitN(col, " #", 2)
	// 		key = strings.TrimSpace(keySplit[0])
	// 		keySplitOne = strings.TrimSpace(keySplit[0])
	// 		fmt.Print(keySplitOne)
	// 		if existingHS, ok := checkHeader[key]; ok {
	// 			hs = existingHS
	// 		}

	// 		// Burada keySplitOne değerine göre hs struct'ının hangi alanını dolduracağımızı belirliyoruz
	// 		if keySplit[1] == "B" {
	// 			hs.B = keySplit[1]
	// 		} else if keySplit[1] == "N" {
	// 			hs.N = keySplit[1]
	// 		} else if keySplit[1] == "G" {
	// 			hs.G = keySplit[1]
	// 		} else if keySplit[1] == "S" {
	// 			hs.S = keySplit[1]
	// 		}
	// 	}
	// 	checkHeader[key] = hs

	// }
	var lastItem bool = false
	// data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur
	for i := 1; i < len(rows); i++ {
		brd := &bot.LucaBordro{
			Sube:     rows[i][0],
			Bolum:    rows[i][1],
			TcNo:     rows[i][2],
			AdSoyad:  rows[i][3],
			Ucretler: make(map[string]decimal.Decimal),
			//Header:   make(map[string]string),
		}
		var status bool = false
		//var ExcelError string
		for ndx, col := range rows[i] {
			if ndx > 3 {
				key := rows[0][ndx]

				if strings.Contains(key, "#") {
					keySplit := strings.SplitN(key, " #", 2)
					keySplitOne := strings.TrimSpace(keySplit[0])
					tseK := strings.TrimSpace(keySplit[1])
					fmt.Print(tseK)
					for k, d := range brd.Ucretler {
						if strings.Contains(k, keySplitOne) { //k=olan
							a := d.String()
							fmt.Print(a)
							if strings.Contains(k, "B") && strings.Contains(tseK, "N") {
								if col != "" && a != "0" {
									emitLog(key + " : aynı anda B ve N Sütunu Girilemez ")
									status = true
									break
								}

							}
							if strings.Contains(k, "N") && strings.Contains(tseK, "B") {
								if col != "" && a != "0" {
									emitLog(key + " : aynı anda N ve B Sütunu Girilemez ")
									status = true

									break
								}
							}
							if strings.Contains(k, "G") && strings.Contains(tseK, "S") {
								if col != "" && a != "0" {
									emitLog(key + ": aynı anda G ve S Sütunu Girilemez ")
									status = true

									break
								}
							}
							if strings.Contains(k, "S") && strings.Contains(tseK, "G") {
								if col != "" && a != "0" {
									emitLog(key + ": aynı anda S ve G Sütunu Girilemez ")
									status = true

									break
								}
							}

						}
					}
					if status {
						break
					}

				}

				brd.Ucretler[key], err = decimal.NewFromString(col)
				if err != nil {
					if strings.Contains(col, ",") {
						col = strings.Replace(col, ",", "", -1)
						brd.Ucretler[key], err = decimal.NewFromString(col)
						if err != nil {
							fmt.Print(err)
						}
					}
					// emitLog(`excel okunurken sorun oluştu`)
					fmt.Println(err)
				}
			}
		}
		if status {
			continue
		}
		if i == len(rows)-1 {
			lastItem = true
		}
		err := b.BordroYaz(int(month), int(year), brd, lastItem)
		var str string
		if err != nil {
			emitLog("Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "Kullanıcı Adı: " + brd.AdSoyad + err.Error())

		} else {
			str = "Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "işlem başarılı,  " + "Kullanıcı Adı: " + brd.AdSoyad
			emitLog(str)

		}

	}
	emitLog("İşlem Tamamlandı")
	b.ClosingBrowserFromExternalLink()
	return nil
}

func emitLog(logMessage string) {
	run.APP.Event.Emit("logProcess", logMessage)
}
