/*
 * Copyright 2026 Oleg Borodin <onborodin@gmail.com>
 *
 * This work is published and licensed under a Creative Commons
 * Attribution-NonCommercial-NoDerivatives 4.0 International License.
 *
 * Distribution of this work is permitted, but commercial use and
 * modifications are strictly prohibited.
 */

package maindb

import (
	"context"

	"mstore/pkg/auxpwd"
	"mstore/pkg/auxtool"
	"mstore/pkg/descr"
	"mstore/pkg/term"
	"mstore/pkg/uuid"
)

func (db *Database) WriteAnonymous(ctx context.Context) error {
	var err error

	now := auxtool.TimeNow()
	password := auxtool.RandomString(64)
	passhash := auxpwd.MakeSHA256Hash([]byte(password))
	accountDescr := &descr.Account{
		ID:        term.AnonymousID,
		Username:  term.AnonimousUsername,
		Passhash:  passhash,
		Disabled:  false,
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertAccount(ctx, accountDescr)
	if err != nil {
		return err
	}
	grantDescr := &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightReadFiles,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}
	grantDescr = &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightReadImages,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}

	return err

}

func (db *Database) WriteInituser(ctx context.Context) error {
	var err error
	now := auxtool.TimeNow()
	passhash := auxpwd.MakeSHA256Hash([]byte(term.InitUsername))
	accountDescr := &descr.Account{
		ID:        term.InitID,
		Username:  term.InitUsername,
		Passhash:  passhash,
		Disabled:  false,
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertAccount(ctx, accountDescr)
	if err != nil {
		return err
	}
	// Files
	grantDescr := &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightReadFiles,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}
	grantDescr = &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightWriteFiles,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}
	// Accounts
	grantDescr = &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightReadAccounts,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}
	grantDescr = &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightWriteAccounts,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}
	// Images
	grantDescr = &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightReadImages,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}
	grantDescr = &descr.Grant{
		ID:        uuid.NewUUID(),
		AccountID: accountDescr.ID,
		Right:     term.RightWriteImages,
		Pattern:   ".*",
		CreatedAt: now,
		UpdatedAt: now,
		CreatedBy: term.ServerID,
		UpdatedBy: term.ServerID,
	}
	err = db.InsertGrant(ctx, grantDescr)
	if err != nil {
		return err
	}
	return err

}
