package srv

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

	"github.com/wailsapp/wails/v3/pkg/application"
	"github.com/xuri/excelize/v2"
)

type Srv struct {
	xlsFileName string
}

func (s *Srv) Companies() ([]company.Company, error) {
	var res []company.Company
	err := run.DB.Select(&res, "SELECT * FROM company order by 1")
	return res, err
}

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

	return c.Create()
}

func (s *Srv) UploadExcel() string {
	dialog := application.OpenFileDialog()
	dialog.AddFilter("Excel Dosyaları", "*.xls;*.xlsx")
	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 getUser(userId string) *userInfo {
	// user, ok := userDB[userId]
	//
	//	if !ok {
	//		return nil
	//	}
	info := userInfo{accountNo: "3197485", userName: "NOTİTEK01", password: "Notitek2025."}
	//info := userInfo{accountNo: "3197485", userName: "NOTİTEK01", password: "sdaasd."}
	return &info
}
func (s *Srv) Rpa(companyName string, month float64, year float64) error {

	user, err := company.GetCompany(companyName)
	if err != nil {

	}
	//todo: readb company details by name
	b := bot.NewLucaBot()
	b.Login(user)
	//b.BordroYaz(data,b.page,,)

	//err := b.Login()
	//err := b.Login(şirket, accoun no, parola vsç..)
	//şirket login bilgilerini sqlite'tan oku
	//ardında BOT init et (global değişken de olmayabilir) init fonksyionu bot'u dönebilir
	//bot'ta login ol
	//bot'ta olması gereken veri yazma sayfasına browse et

	//todo: save xls to application folder as /name/year/month.xlsx

	//wails nümerik değerleri float gönderiyor.. int gönderimi araştırılmalı
	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 rows[0][0] == "" {
		rows = rows[1:]
	}
	data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur
	for i := 1; i < len(rows); i++ {
		bordroSatiri, err := model.NewFromExcelLine(rows[i])
		data = append(data, bordroSatiri)
		//
		fmt.Println(bordroSatiri, err)
	}
	b.BordroYaz(data)

	//for _, row := range rows {
	//	//todo: process excel and do data input
	//	fmt.Println(row)
	//	// satır satır execli oku,
	//
	//	//yukarıda init edilen bot'ta' yazma kodunu çalıştır..
	//
	//	bordroSatiri, err := model.NewFromExcelLine(row)
	//	fmt.Println(bordroSatiri, err)
	//	b.BordroYaz(bordroSatiri)
	//
	//	//todo: inform user about process and errors
	//	emitLog(row[1])
	//}

	return nil
}

func emitLog(logMessage string) {
	run.APP.Events.Emit(&application.WailsEvent{
		Name: "logProcess",
		Data: logMessage,
	})
}
