package models

import "encoding/json"

// ======================================================
// 👤 USER DETAIL — GET RESPONSE
// UserDetail.vue formuna birebir
// ======================================================
type UserDetail struct {
	ID       int64  `json:"id"`
	Code     string `json:"code"`
	IsActive bool   `json:"is_active"`
	FullName string `json:"full_name"`
	Email    string `json:"email"`
	Mobile   string `json:"mobile"`
	Address  string `json:"address"`

	HasPassword bool `json:"has_password"` // 🔐 SADECE DURUM

	// ===== İLİŞKİLER =====
	Roles                     []string      `json:"roles"`
	Departments               []DeptOption  `json:"departments"`
	Piyasalar                 []DeptOption  `json:"piyasalar"`
	NebimUsers                []NebimOption `json:"nebim_users"`
	OrderPriceListPriceGroups []string      `json:"order_price_list_price_groups"`
}

// ======================================================
// ✍️ USER WRITE — PUT PAYLOAD
// ======================================================
type UserWrite struct {
	Code     string `json:"code"`
	IsActive bool   `json:"is_active"`
	FullName string `json:"full_name"`
	Email    string `json:"email"`
	Mobile   string `json:"mobile"`
	Address  string `json:"address"`

	Roles                     []string      `json:"roles"`
	Departments               []DeptOption  `json:"departments"`
	Piyasalar                 []DeptOption  `json:"piyasalar"`
	NebimUsers                []NebimOption `json:"nebim_users"`
	OrderPriceListPriceGroups []string      `json:"order_price_list_price_groups"`
}

// ======================================================
// 🔹 COMMON OPTION MODELS
// ======================================================
type DeptOption struct {
	Code  string `json:"code"`
	Title string `json:"title,omitempty"`
}

// Flexible JSON decode
func (d *DeptOption) UnmarshalJSON(data []byte) error {

	var raw struct {
		Code  any    `json:"code"`
		Title string `json:"title"`
	}

	if err := json.Unmarshal(data, &raw); err != nil {
		return err
	}

	d.Title = raw.Title

	switch v := raw.Code.(type) {

	case string:
		d.Code = v

	case []any:
		if len(v) > 0 {
			if s, ok := v[0].(string); ok {
				d.Code = s
			}
		}

	default:
		d.Code = ""
	}

	return nil
}

type NebimOption struct {
	Username      string `json:"username"`
	UserGroupCode string `json:"user_group_code"`
}
