<?php

require_once BASE_PATH
    . '/app/controllers/customer/CustomerBaseController.php';

require_once BASE_PATH
    . '/app/models/User.php';

require_once BASE_PATH . '/app/models/RememberToken.php';


class CustomerProfileController
    extends CustomerBaseController
{
    private User $userModel;


    public function __construct()
    {
        $this->requireCustomer();

        $this->userModel =
            new User();
    }


    public function index(): void
    {
        $customerId =
            (int)
            $_SESSION['user']['id'];


        $customer =
            $this->userModel
                ->findById(
                    $customerId
                );


        require BASE_PATH
            . '/app/views/customer/profile.php';
    }


    public function update(): void
    {
        $this->requirePost();

        $this->validateCsrf();


        $customerId =
            (int)
            $_SESSION['user']['id'];


        $fullName =
            trim(
                $_POST['full_name']
                ?? ''
            );


        $phone =
            trim(
                $_POST['phone']
                ?? ''
            );


        $email =
            strtolower(
                trim(
                    $_POST['email']
                    ?? ''
                )
            );


        if (
            mb_strlen(
                $fullName
            ) < 2
        ) {

            $this->flashError(
                'Họ tên không hợp lệ.'
            );

            $this->redirect(
                'customer/profile'
            );
        }


        if (
            !preg_match(
                '/^0[0-9]{9}$/',
                $phone
            )
        ) {

            $this->flashError(
                'Số điện thoại không hợp lệ.'
            );

            $this->redirect(
                'customer/profile'
            );
        }


        $existingPhone =
            $this->userModel
                ->findByIdentifier(
                    $phone
                );


        if (
            $existingPhone
            && (int)
            $existingPhone['id']
            !== $customerId
        ) {

            $this->flashError(
                'Số điện thoại đã được sử dụng.'
            );

            $this->redirect(
                'customer/profile'
            );
        }


        if ($email !== '') {

            if (
                !filter_var(
                    $email,
                    FILTER_VALIDATE_EMAIL
                )
            ) {

                $this->flashError(
                    'Email không hợp lệ.'
                );

                $this->redirect(
                    'customer/profile'
                );
            }


            $existingEmail =
                $this->userModel
                    ->findByIdentifier(
                        $email
                    );


            if (
                $existingEmail
                && (int)
                $existingEmail['id']
                !== $customerId
            ) {

                $this->flashError(
                    'Email đã được sử dụng.'
                );

                $this->redirect(
                    'customer/profile'
                );
            }
        }


        $this->userModel
            ->updateProfile(
                $customerId,
                [
                    'full_name' =>
                        $fullName,

                    'phone' =>
                        $phone,

                    'email' =>
                        $email !== ''
                            ? $email
                            : null
                ]
            );

        $_SESSION['user']['full_name'] =
            $fullName;

        $_SESSION['user']['phone'] =
            $phone;

        $_SESSION['user']['email'] =
            $email !== ''
                ? $email
                : null;


        $this->flashSuccess(
            'Đã cập nhật hồ sơ.'
        );


        $this->redirect(
            'customer/profile'
        );
    }


    public function changePassword(): void
    {
        $this->requirePost();

        $this->validateCsrf();


        $customerId =
            (int)
            $_SESSION['user']['id'];


        $customer =
            $this->userModel
                ->findById(
                    $customerId
                );


        $currentPassword =
            $_POST['current_password']
            ?? '';


        $newPassword =
            $_POST['new_password']
            ?? '';


        $confirmation =
            $_POST['new_password_confirmation']
            ?? '';


        if (
            !$customer
            || !password_verify(
                $currentPassword,
                $customer['password_hash']
            )
        ) {

            $this->flashError(
                'Mật khẩu hiện tại không chính xác.'
            );

            $this->redirect(
                'customer/profile'
            );
        }


        if (
            strlen(
                $newPassword
            ) < 8
        ) {

            $this->flashError(
                'Mật khẩu mới phải có ít nhất 8 ký tự.'
            );

            $this->redirect(
                'customer/profile'
            );
        }


        if (
            $newPassword
            !== $confirmation
        ) {

            $this->flashError(
                'Xác nhận mật khẩu mới không khớp.'
            );

            $this->redirect(
                'customer/profile'
            );
        }


        $this->userModel
            ->updatePassword(
                $customerId,
                password_hash(
                    $newPassword,
                    PASSWORD_DEFAULT
                )
            );

        (new RememberToken())->revokeAllForUser($customerId);


        $this->flashSuccess(
            'Đổi mật khẩu thành công.'
        );


        $this->redirect(
            'customer/profile'
        );
    }
}
