import logging
import environ

from django.conf import settings
from django.contrib import messages
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View, generic

from .forms import LoginForm, RegisterForm, ProfileForm

logger = logging.getLogger(__name__)

@login_required
def home(request):
    return render(request, "accounts/home.html")

env = environ.Env()
register_password = env('register_pass')

class RegisterView(View):
    def get(self, request, *args, **kwargs):
        # すでにログインしている場合はショップ画面へリダイレクト
        if request.user.is_authenticated:
            return redirect(reverse('accounts:home'))

        context = {
            'form': RegisterForm(),
        }
        return render(request, 'accounts/register.html', context)

    def post(self, request, *args, **kwargs):
        logger.info("You're in post!!!")

        # リクエストからフォームを作成
        form = RegisterForm(request.POST)
        # バリデーション
        if not form.is_valid():
            # バリデーションNGの場合はアカウント登録画面のテンプレートを再表示
            return render(request, 'accounts/register.html', {'form': form})

        print("###################")
        print(request.POST.dict())
        print(request.POST.dict()["register_pass"])
        if request.POST.dict()["register_pass"] == register_password:
            print("成功！！")
            # 保存する前に一旦取り出す
            user = form.save(commit=False)
            # パスワードをハッシュ化してセット
            user.set_password(form.cleaned_data['password'])
            # ユーザーオブジェクトを保存
            user.save()

            # ログイン処理（取得した Userオブジェクトをセッションに保存 & Userデータを更新）
            auth_login(request, user)

            return redirect(settings.LOGIN_REDIRECT_URL)

        return render(request, 'accounts/register.html', {'form': form})


# register = RegisterView.as_view()


class LoginView(View):
    def get(self, request, *args, **kwargs):
        """GETリクエスト用のメソッド"""
        if request.user.is_authenticated:
            return redirect(reverse('accounts:home'))

        context = {
            'form': LoginForm(),
        }
        # ログイン画面用のテンプレートに値が空のフォームをレンダリング
        return render(request, 'accounts/login.html', context)

    def post(self, request, *args, **kwargs):
        """POSTリクエスト用のメソッド"""
        # リクエストからフォームを作成
        form = LoginForm(request.POST)
        # バリデーション（ユーザーの認証も合わせて実施）
        if not form.is_valid():
            # バリデーションNGの場合はログイン画面のテンプレートを再表示
            return render(request, 'accounts/login.html', {'form': form})

        # ユーザーオブジェクトをフォームから取得
        user = form.get_user()

        # ログイン処理（取得したユーザーオブジェクトをセッションに保存 & ユーザーデータを更新）
        auth_login(request, user)

        # ログイン後処理（ログイン回数を増やしたりする。本来は user_logged_in シグナルを使えばもっと簡単に書ける）
        # user.post_login()

        # ロギング
        # logger.info("User(id={}) has logged in.".format(user.id))

        # フラッシュメッセージを画面に表示
        # messages.info(request, "ログインしました。")

        return redirect(reverse('accounts:home'))


# login = LoginView.as_view()


class LogoutView(View):
    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            # ロギング
            logger.info("User(id={}) has logged out.".format(request.user.id))
            # ログアウト処理
            auth_logout(request)

        # フラッシュメッセージを画面に表示
        messages.info(request, "ログアウトしました。")

        return redirect(reverse('accounts:login'))


# logout = LogoutView.as_view()


class ProfileView(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        form = ProfileForm(None, instance=request.user)
        context = {
            'form': form,
        }
        return render(request, 'accounts/profile.html', context)

    def post(self, request, *args, **kwargs):
        logger.info("You're in post!!!")

        # フォームを使ってバリデーション
        form = ProfileForm(request.POST, instance=request.user)
        if not form.is_valid():
            return render(request, 'accounts/profile.html', {'form': form})

        # 変更を保存
        form.save()

        # フラッシュメッセージを画面に表示
        messages.info(request, "プロフィールを更新しました。")
        return redirect('/accounts/profile/')

class RegistrationComp(generic.TemplateView):
    template_name = 'registration_complete.html'

# profile = ProfileView.as_view()

import logging
import environ

from django.conf import settings
from django.contrib import messages
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View, generic

from .forms import LoginForm, RegisterForm, ProfileForm

logger = logging.getLogger(__name__)

@login_required
def home(request):
    return render(request, "accounts/home.html")

env = environ.Env()
register_password = env('register_pass')

class RegisterView(View):
    def get(self, request, *args, **kwargs):
        # すでにログインしている場合はショップ画面へリダイレクト
        if request.user.is_authenticated:
            return redirect(reverse('accounts:home'))

        context = {
            'form': RegisterForm(),
        }
        return render(request, 'accounts/register.html', context)

    def post(self, request, *args, **kwargs):
        logger.info("You're in post!!!")

        # リクエストからフォームを作成
        form = RegisterForm(request.POST)
        # バリデーション
        if not form.is_valid():
            # バリデーションNGの場合はアカウント登録画面のテンプレートを再表示
            return render(request, 'accounts/register.html', {'form': form})

        print("###################")
        print(request.POST.dict())
        print(request.POST.dict()["register_pass"])
        if request.POST.dict()["register_pass"] == register_password:
            print("成功！！")
            # 保存する前に一旦取り出す
            user = form.save(commit=False)
            # パスワードをハッシュ化してセット
            user.set_password(form.cleaned_data['password'])
            # ユーザーオブジェクトを保存
            user.save()

            # ログイン処理（取得した Userオブジェクトをセッションに保存 & Userデータを更新）
            auth_login(request, user)

            return redirect(settings.LOGIN_REDIRECT_URL)

        return render(request, 'accounts/register.html', {'form': form})


# register = RegisterView.as_view()


class LoginView(View):
    def get(self, request, *args, **kwargs):
        """GETリクエスト用のメソッド"""
        if request.user.is_authenticated:
            return redirect(reverse('accounts:home'))

        context = {
            'form': LoginForm(),
        }
        # ログイン画面用のテンプレートに値が空のフォームをレンダリング
        return render(request, 'accounts/login.html', context)

    def post(self, request, *args, **kwargs):
        """POSTリクエスト用のメソッド"""
        # リクエストからフォームを作成
        form = LoginForm(request.POST)
        # バリデーション（ユーザーの認証も合わせて実施）
        if not form.is_valid():
            # バリデーションNGの場合はログイン画面のテンプレートを再表示
            return render(request, 'accounts/login.html', {'form': form})

        # ユーザーオブジェクトをフォームから取得
        user = form.get_user()

        # ログイン処理（取得したユーザーオブジェクトをセッションに保存 & ユーザーデータを更新）
        auth_login(request, user)

        # ログイン後処理（ログイン回数を増やしたりする。本来は user_logged_in シグナルを使えばもっと簡単に書ける）
        # user.post_login()

        # ロギング
        # logger.info("User(id={}) has logged in.".format(user.id))

        # フラッシュメッセージを画面に表示
        # messages.info(request, "ログインしました。")

        return redirect(reverse('accounts:home'))


# login = LoginView.as_view()


class LogoutView(View):
    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            # ロギング
            logger.info("User(id={}) has logged out.".format(request.user.id))
            # ログアウト処理
            auth_logout(request)

        # フラッシュメッセージを画面に表示
        messages.info(request, "ログアウトしました。")

        return redirect(reverse('accounts:login'))


# logout = LogoutView.as_view()


class ProfileView(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        form = ProfileForm(None, instance=request.user)
        context = {
            'form': form,
        }
        return render(request, 'accounts/profile.html', context)

    def post(self, request, *args, **kwargs):
        logger.info("You're in post!!!")

        # フォームを使ってバリデーション
        form = ProfileForm(request.POST, instance=request.user)
        if not form.is_valid():
            return render(request, 'accounts/profile.html', {'form': form})

        # 変更を保存
        form.save()

        # フラッシュメッセージを画面に表示
        messages.info(request, "プロフィールを更新しました。")
        return redirect('/accounts/profile/')

class RegistrationComp(generic.TemplateView):
    template_name = 'registration_complete.html'

# profile = ProfileView.as_view()

# すでにログインしている場合はショップ画面へリダイレクト # リクエストからフォームを作成 # バリデーション # バリデーションNGの場合はアカウント登録画面のテンプレートを再表示 ##################") # 保存する前に一旦取り出す # パスワードをハッシュ化してセット # ユーザーオブジェクトを保存 # ログイン処理（取得した Userオブジェクトをセッションに保存 & Userデータを更新） # register = RegisterView.as_view() GETリクエスト用のメソッド # ログイン画面用のテンプレートに値が空のフォームをレンダリング POSTリクエスト用のメソッド # リクエストからフォームを作成 # バリデーション（ユーザーの認証も合わせて実施） # バリデーションNGの場合はログイン画面のテンプレートを再表示 # ユーザーオブジェクトをフォームから取得 # ログイン処理（取得したユーザーオブジェクトをセッションに保存 & ユーザーデータを更新） # ログイン後処理（ログイン回数を増やしたりする。本来は user_logged_in シグナルを使えばもっと簡単に書ける） # user.post_login() # ロギング # logger.info("User(id={}) has logged in.".format(user.id)) # フラッシュメッセージを画面に表示 # messages.info(request, "ログインしました。") # login = LoginView.as_view() # ロギング # ログアウト処理 # フラッシュメッセージを画面に表示 # logout = LogoutView.as_view() # フォームを使ってバリデーション # 変更を保存 # フラッシュメッセージを画面に表示 # profile = ProfileView.as_view()