package mysql

import (
	"context"
	"database/sql"

	"git.gocasts.ir/ebhomengo/niki/domain/benefactor/entity"
	errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
	richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
	"git.gocasts.ir/ebhomengo/niki/pkg/types"
)

func (d *DB) Create(ctx context.Context, b entity.Benefactor) (entity.Benefactor, error) {
	const op = "repository.mysql.benefactor.create"

	query := `INSERT INTO benefactors 
			(first_name, last_name, phone_number, description, email, gender, birthdate)
			 VALUES(?, ?, ?, ?, ?, ?, ?)`

	res, err := d.conn.Conn().ExecContext(ctx, query,
		 b.FirstName, b.LastName, b.PhoneNumber,b.Description, b.Email, b.Gender, b.BirthDate)

	if err != nil {
		return entity.Benefactor{}, richerror.New(op).WithErr(err).
		WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected)
	}

	id, _ := res.LastInsertId()
	b.ID = types.ID(id)

	return b, nil
}

func (d *DB) GetBenefactorByID(ctx context.Context, benefactorID types.ID) (entity.Benefactor, error) {
	const op = "repository.mysql.benefactor.getBenefactorById"
	var b entity.Benefactor

	query := `SELECT * FROM benefactors WHERE id = ?`

	row := d.conn.Conn().QueryRowContext(ctx, query, benefactorID)
	err := row.Scan(&b.ID, &b.FirstName, &b.LastName, &b.PhoneNumber,
					&b.Description, &b.Email, b.Gender, b.BirthDate, b.Status)

	if err != nil {
		if err == sql.ErrNoRows {
			return entity.Benefactor{}, richerror.New(op).WithErr(err).
				WithMessage(errmsg.ErrorMsgNotFound).WithKind(richerror.KindNotFound)
		}

		return entity.Benefactor{}, richerror.New(op).WithErr(err).
			WithMessage(errmsg.ErrorMsgCantScanQueryResult).WithKind(richerror.KindUnexpected)
	}

	return b, nil

}

func (d *DB) Activate(ctx context.Context, benefactorID types.ID) error {
	const op = "repository.mysql.benefactor.Activate"

	query := `UPDATE benefactors SET status ='active' WHERE id = ?` 

	_, err := d.conn.Conn().ExecContext(ctx, query, benefactorID) 

	if err != nil {
		return richerror.New(op).WithErr(err).
		WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected)
	}

	return nil
}

func (d *DB) Deactivate(ctx context.Context, benefactorID types.ID) error {
	const op = "repository.mysql.benefactor.Deativate"

	query := `UPDATE benefactors SET status ='inactive' WHERE id = ?` 

	_, err := d.conn.Conn().ExecContext(ctx, query, benefactorID) 

	if err != nil {
		return richerror.New(op).WithErr(err).
		WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected)
	}

	return nil
}
