<?php

namespace Give\FormMigration\Controllers;

use Give\Campaigns\Repositories\CampaignRepository;
use Give\DonationForms\V2\Models\DonationForm;
use Give\FormMigration\Actions\GetMigratedFormId;
use Give\FormMigration\Actions\TransferDonations;
use Give\FormMigration\Actions\TransferFormUrl;
use Give\FormMigration\DataTransferObjects\TransferOptions;
use Give\Framework\Database\DB;
use WP_REST_Request;
use WP_REST_Response;

class TransferController
{
    protected $debugContext;

    /**
     * @var WP_REST_Request
     */
    protected $request;

    public function __construct(WP_REST_Request $request)
    {
        $this->request = $request;
    }

    public function __invoke(DonationForm $formV2, TransferOptions $options)
    {
        DB::transaction(function() use ($formV2, $options) {

            $v3FormId = (new GetMigratedFormId)($formV2->id);
            TransferFormUrl::from($formV2->id)->to($v3FormId);
            TransferDonations::from($formV2->id)->to($v3FormId);

            // Promote upgraded form to default form
            $campaignRepository = give(CampaignRepository::class);
            if ($campaign = $campaignRepository->getByFormId($formV2->id)) {
                $defaultForm = $campaign->defaultForm();

                if ($defaultForm->id === $formV2->id) {
                    $campaignRepository->updateDefaultCampaignForm($campaign, $v3FormId);
                }
            }

            if($options->shouldDelete()) {
                wp_trash_post($formV2->id);
            }

            wp_update_post(['ID' => $v3FormId, 'post_status' => $formV2->status->getValue()]);
            give_update_meta($v3FormId, 'transferredFormId', true);
        });

        return new WP_REST_Response(array('errors' => [], 'successes' => [
            $formV2->id
        ]));
    }
}
