/*
 * 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 handler

import (
	"fmt"

	"mstore/app/operator"
	"mstore/app/router"
	"mstore/pkg/terms"
)

// POST /v3/account/create 200 200
func (hand *Handler) CreateAccount(rctx *router.Context) {
	var err error

	params := &operator.CreateAccountParams{}
	err = rctx.BindJSON(params)
	if err != nil {
		hand.SendError(rctx, err)
		return
	}
	// Rigth checking
	operatorID, _ := rctx.GetString(userTag)
	opEnable, err := hand.CheckRight(rctx.Ctx, operatorID, terms.RightWriteAccounts, "")
	if err != nil {
		err := fmt.Errorf("Operation error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	if !opEnable {
		err := fmt.Errorf("Operation not enabled for this account")
		hand.SendError(rctx, err)
		return
	}
	// Execution of the operation
	res, err := hand.oper.CreateAccount(rctx.Ctx, operatorID, params)
	if err != nil {
		hand.logg.Errorf("Operation error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	hand.SendResult(rctx, res)
}

// POST /v3/account/get 200 200
func (hand *Handler) GetAccount(rctx *router.Context) {
	var err error

	params := &operator.GetAccountParams{}
	err = rctx.BindJSON(params)
	if err != nil {
		hand.SendError(rctx, err)
		return
	}
	// Rigth checking
	operatorID, _ := rctx.GetString(userTag)
	opEnable, err := hand.CheckRight(rctx.Ctx, operatorID, terms.RightWriteAccounts, "")
	if err != nil {
		err := fmt.Errorf("Operation error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	if !opEnable {
		err := fmt.Errorf("Operation not enabled for this account")
		hand.SendError(rctx, err)
		return
	}
	// Execution of the operation
	res, err := hand.oper.GetAccount(rctx.Ctx, operatorID, params)
	if err != nil {
		hand.logg.Errorf("Operation error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	hand.SendResult(rctx, res)
}

// POST /v3/accounts/list 200 200
func (hand *Handler) ListAccounts(rctx *router.Context) {
	var err error

	params := &operator.ListAccountsParams{}
	err = rctx.BindJSON(params)
	if err != nil {
		hand.SendError(rctx, err)
		return
	}
	// Rigth checking
	operatorID, _ := rctx.GetString(userTag)
	opEnable, err := hand.CheckRight(rctx.Ctx, operatorID, terms.RightWriteAccounts, "")
	if err != nil {
		err := fmt.Errorf("Operation error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	if !opEnable {
		err := fmt.Errorf("Operation not enabled for this account")
		hand.SendError(rctx, err)
		return
	}
	// Execution of the operation
	res, err := hand.oper.ListAccounts(rctx.Ctx, params)
	if err != nil {
		hand.logg.Errorf("ListAccounts error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	hand.SendResult(rctx, res)
}

// POST /v3/account/get 200 200
func (hand *Handler) UpdateAccount(rctx *router.Context) {
	var err error

	params := &operator.UpdateAccountParams{}
	err = rctx.BindJSON(params)
	if err != nil {
		hand.SendError(rctx, err)
		return
	}
	// Rigth checking
	operatorID, _ := rctx.GetString(userTag)
	opEnable, err := hand.CheckRight(rctx.Ctx, operatorID, terms.RightWriteAccounts, "")
	if err != nil {
		err := fmt.Errorf("Operation error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	if !opEnable {
		err := fmt.Errorf("Operation not enabled for this account")
		hand.SendError(rctx, err)
		return
	}
	// Execution of the operation
	res, err := hand.oper.UpdateAccount(rctx.Ctx, operatorID, params)
	if err != nil {
		hand.logg.Errorf("UpdateAccount error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	hand.SendResult(rctx, res)
}

// POST /v3/account/delete 200 200
func (hand *Handler) DeleteAccount(rctx *router.Context) {
	var err error

	params := &operator.DeleteAccountParams{}
	err = rctx.BindJSON(params)
	if err != nil {
		hand.SendError(rctx, err)
		return
	}
	// Rigth checking
	operatorID, _ := rctx.GetString(userTag)
	opEnable, err := hand.CheckRight(rctx.Ctx, operatorID, terms.RightWriteAccounts, params.Username)
	if err != nil {
		err := fmt.Errorf("Operation error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	if !opEnable {
		err := fmt.Errorf("Operation not enabled for this account")
		hand.SendError(rctx, err)
		return
	}
	// Execution of the operation
	res, err := hand.oper.DeleteAccount(rctx.Ctx, operatorID, params)
	if err != nil {
		hand.logg.Errorf("DeleteAccount error: %v", err)
		hand.SendError(rctx, err)
		return
	}
	hand.SendResult(rctx, res)
}
