package api

import (
	"fmt"

	"src.rybka.ca/pkg/apps/settings"
	"src.rybka.ca/pkg/people"
	"src.rybka.ca/pkg/storage"
)

type User struct {
	AccountID string
	db        *storage.LocalClient
}

func (u *User) Logout() error {
	return u.db.Delete(fmt.Sprintf("auth/sessions/%s", u.AccountID))
}

func (u *User) Settings() (*settings.Data, error) {
	res := &settings.Data{}

	b, err := u.db.ReadFile(fmt.Sprintf("%s/settings/display_name", u.AccountID))
	if err != nil {
		return nil, err
	}
	res.DisplayName = string(b)

	return res, nil
}

func (u *User) SetSettingsDisplayName(n string) error {
	return u.db.WriteFile(fmt.Sprintf("%s/settings/display_name", u.AccountID), n)
}

func (u *User) People() (people.Data, error) {
	res := people.Data{}

	list, err := u.db.ReadDir(fmt.Sprintf("%s/people", u.AccountID))
	if err != nil {
		return nil, err
	}
	for _, id := range list {
		b, err := u.db.ReadFile(fmt.Sprintf("%s/settings/display_name", id))
		if err != nil {
			return nil, err
		}
		res[id] = people.Person{
			Name: string(b),
		}
	}

	return res, nil
}

func (u *User) IsConnected(accountID string) (bool, error) {
	s, err := u.db.ReadFile(fmt.Sprintf("%s/people/%s", accountID, u.AccountID))
	if err != nil {
		return false, err
	}
	return s == "true", nil
}
