package Travelynx::Controller::Traewelling;

# Copyright (C) 2020-2023 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
use Mojo::Base 'Mojolicious::Controller';
use Mojo::Promise;

sub oauth {
	my ($self) = @_;

	if (    $self->param('action')
		and $self->validation->csrf_protect->has_error('csrf_token') )
	{
		$self->render(
			'bad_request',
			csrf   => 1,
			status => 400
		);
		return;
	}

	$self->render_later;

	my $oa = $self->config->{traewelling}{oauth};

	return $self->oauth2->get_token_p(
		traewelling => {
			redirect_uri =>
			  $self->base_url_for('/oauth/traewelling')->to_abs->scheme(
				$self->app->mode eq 'development' ? 'http' : 'https'
			)->to_string,
			scope => 'read-statuses write-statuses'
		}
	)->then(
		sub {
			my ($provider) = @_;
			if ( not defined $provider ) {

				# OAuth2 plugin performed a redirect, no need to render
				return;
			}
			if ( not $provider or not $provider->{access_token} ) {
				$self->flash( new_traewelling => 1 );
				$self->flash( login_error     => 'no token received' );
				$self->redirect_to('/account/traewelling');
				return;
			}
			my $uid   = $self->current_user->{id};
			my $token = $provider->{access_token};
			$self->traewelling->link(
				uid           => $self->current_user->{id},
				token         => $provider->{access_token},
				refresh_token => $provider->{refresh_token},
				expires_in    => $provider->{expires_in},
			);
			return $self->traewelling_api->get_user_p( $uid, $token )->then(
				sub {
					$self->flash( new_traewelling => 1 );
					$self->redirect_to('/account/traewelling');
				}
			);
		}
	)->catch(
		sub {
			my ($err) = @_;
			say "error $err";
			$self->flash( new_traewelling => 1 );
			$self->flash( login_error     => $err );
			$self->redirect_to('/account/traewelling');
			return;
		}
	);
}

sub settings {
	my ($self) = @_;

	my $uid = $self->current_user->{id};

	if (    $self->param('action')
		and $self->validation->csrf_protect->has_error('csrf_token') )
	{
		$self->render(
			'bad_request',
			csrf   => 1,
			status => 400
		);
		return;
	}

	if ( $self->param('action') and $self->param('action') eq 'logout' ) {
		$self->render_later;
		my $traewelling = $self->traewelling->get( uid => $uid );
		$self->traewelling_api->logout_p(
			uid   => $uid,
			token => $traewelling->{token}
		)->then(
			sub {
				$self->flash( success => 'traewelling' );
				$self->redirect_to('account');
			}
		)->catch(
			sub {
				my ($err) = @_;
				$self->render(
					'traewelling',
					traewelling     => {},
					new_traewelling => 1,
					logout_error    => $err,
				);
			}
		)->wait;
		return;
	}
	elsif ( $self->param('action') and $self->param('action') eq 'config' ) {
		$self->traewelling->set_sync(
			uid       => $uid,
			push_sync => $self->param('sync_source') eq 'travelynx'   ? 1 : 0,
			pull_sync => $self->param('sync_source') eq 'traewelling' ? 1 : 0,
			toot      => $self->param('toot')                         ? 1 : 0,
			tweet     => $self->param('tweet')                        ? 1 : 0,
		);
		$self->flash( success => 'traewelling' );
		$self->redirect_to('account');
		return;
	}

	my $traewelling = $self->traewelling->get( uid => $uid );

	if ( $traewelling->{push_sync} ) {
		$self->param( sync_source => 'travelynx' );
	}
	elsif ( $traewelling->{pull_sync} ) {
		$self->param( sync_source => 'traewelling' );
	}
	else {
		$self->param( sync_source => 'none' );
	}
	if ( $traewelling->{data}{toot} ) {
		$self->param( toot => 1 );
	}
	if ( $traewelling->{data}{tweet} ) {
		$self->param( tweet => 1 );
	}

	$self->stash( title => 'travelynx × träwelling' );
	$self->render(
		'traewelling',
		traewelling => $traewelling,
	);
}

1;
