// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package user

import (
	"errors"

	user_model "code.gitea.io/gitea/models/user"
	"code.gitea.io/gitea/modules/web"
	"code.gitea.io/gitea/services/context"
	"code.gitea.io/gitea/services/forms"
	user_service "code.gitea.io/gitea/services/user"
)

func BlockedUsers(ctx *context.Context, blocker *user_model.User) {
	blocks, _, err := user_model.FindBlockings(ctx, &user_model.FindBlockingOptions{
		BlockerID: blocker.ID,
	})
	if err != nil {
		ctx.ServerError("FindBlockings", err)
		return
	}
	if err := user_model.BlockingList(blocks).LoadAttributes(ctx); err != nil {
		ctx.ServerError("LoadAttributes", err)
		return
	}
	ctx.Data["UserBlocks"] = blocks
}

func BlockedUsersPost(ctx *context.Context, blocker *user_model.User) {
	form := web.GetForm(ctx).(*forms.BlockUserForm)
	if ctx.HasError() {
		ctx.ServerError("FormValidation", nil)
		return
	}

	blockee, err := user_model.GetUserByName(ctx, form.Blockee)
	if err != nil {
		ctx.ServerError("GetUserByName", nil)
		return
	}

	switch form.Action {
	case "block":
		if err := user_service.BlockUser(ctx, ctx.Doer, blocker, blockee, form.Note); err != nil {
			if errors.Is(err, user_model.ErrCanNotBlock) || errors.Is(err, user_model.ErrBlockOrganization) {
				ctx.Flash.Error(ctx.Tr("user.block.block.failure", err.Error()))
			} else {
				ctx.ServerError("BlockUser", err)
				return
			}
		}
	case "unblock":
		if err := user_service.UnblockUser(ctx, ctx.Doer, blocker, blockee); err != nil {
			if errors.Is(err, user_model.ErrCanNotUnblock) || errors.Is(err, user_model.ErrBlockOrganization) {
				ctx.Flash.Error(ctx.Tr("user.block.unblock.failure", err.Error()))
			} else {
				ctx.ServerError("UnblockUser", err)
				return
			}
		}
	case "note":
		block, err := user_model.GetBlocking(ctx, blocker.ID, blockee.ID)
		if err != nil {
			ctx.ServerError("GetBlocking", err)
			return
		}
		if block != nil {
			if err := user_model.UpdateBlockingNote(ctx, block.ID, form.Note); err != nil {
				ctx.ServerError("UpdateBlockingNote", err)
				return
			}
		}
	}
}