package repository

import (
	"context"
	"git.gocasts.ir/ebhomengo/niki/domain/authorization/service"
	"git.gocasts.ir/ebhomengo/niki/pkg/database/mysql"
	richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
	"git.gocasts.ir/ebhomengo/niki/types"
)

type RoleRepo struct {
	conn *mysql.DB
}

func New(conn *mysql.DB) *RoleRepo {
	return &RoleRepo{conn: conn}
}

func (m RoleRepo) Store(ctx context.Context, req service.StoreRoleRequest) (types.ID, error) {
	const op = "domain.authorization.repository.role.store"

	result, err := m.conn.Conn().ExecContext(ctx, "INSERT INTO roles VALUES (`?,?`)", req.Title, req.TitleFa)
	if err != nil {
		return 0, richerror.New(op).WithErr(err)
	}

	roleID, err := result.LastInsertId()
	if err != nil {
		return 0, richerror.New(op).WithErr(err)
	}

	return types.ID(roleID), nil
}

func (m RoleRepo) Update(ctx context.Context, req service.UpdateRoleRequest) (types.ID, error) {
	const op = "domain.authorization.repository.role.update"

	result, err := m.conn.Conn().ExecContext(ctx,
		"UPDATE roles SET title = ?, title_fa = ? WHERE id = ?",
		req.Title, req.TitleFa, req.ID)

	if err != nil {
		return 0, richerror.New(op).WithErr(err)
	}

	_, err = result.RowsAffected()
	if err != nil {
		return 0, richerror.New(op).WithErr(err)
	}

	return types.ID(req.ID), nil
}


func (m RoleRepo) IsRoleExistsByID(ctx context.Context, id types.ID) error {
	const op = "domain.authorization.repository.role.is_exists_by_id"

	var exists bool
	err := m.conn.Conn().QueryRowContext(ctx, "SELECT EXISTS(SELECT 1 FROM roles WHERE id = ?)", id).Scan(&exists)
	if err != nil {
		return richerror.New(op).WithErr(err)
	}
	return nil
}
