import os

from flask import request, redirect, url_for
from flask_admin.contrib.sqla.fields import QuerySelectField
from flask_admin.form import Select2Widget
from flask_login import current_user, logout_user
from werkzeug.utils import secure_filename
from wtforms.fields.choices import SelectField
from wtforms.fields.simple import FileField, HiddenField, TextAreaField
from flask_admin.form.upload import ImageUploadField

from webgds import app, db
from flask_admin import Admin, expose, BaseView
from flask_admin.contrib.sqla import ModelView
from webgds.models import Category, Project, About, Contact, ProjectImage, Service, Tag, ProjectTag, Team, UserRole, Subscriber
from flask_admin.form import rules

admin = Admin(app=app, name='Website GDs', template_mode='bootstrap4')


class AuthenticatedView(ModelView):
    def is_accessible(self):
        return current_user.is_authenticated and current_user.user_role == UserRole.ADMIN

class CustomProjectView(AuthenticatedView):
    name = "Du an"
    can_view_details = True
    can_export = True
    column_auto_select_related = True
    column_display_all_relations = True
    column_searchable_list = ['name', 'description']
    column_filters = ['name', 'description', 'active', 'created_date']
    column_labels = {
        'name': 'Tên dự án',
        'description': 'Mô tả',
        'link': 'Youtube',
        'image': 'Ảnh đại diện',
        'active': 'Hoạt động',
        'created_date': 'Ngày tạo',
        'category': 'Danh mục'
    }
    column_list = ['name', 'description', 'link', 'image', 'category']
    # form_columns = ['name', 'description', 'image', 'link', 'active', 'category_id']
    form_extra_fields = {
        'image': ImageUploadField('Image', base_path='static/images/imgProject'),

        'category': QuerySelectField('Danh mục',
                                     query_factory=lambda: db.session.query(Category),
                                     allow_blank=False,
                                     widget=Select2Widget()
                                    ),
        # 'category_id': HiddenField()
    }


# class CustomProjectView(AuthenticatedView):
#     name = "Dự án"
#     can_view_details = True
#     can_export = True
#     column_auto_select_related = True
#     column_display_all_relations = True
#     column_searchable_list = ['name', 'description']
#     column_filters = ['name', 'description', 'active', 'created_date']
#     column_labels = {
#         'name': 'Tên dự án',
#         'description': 'Mô tả',
#         'link': 'Youtube',
#         'image': 'Ảnh đại diện',
#         'active': 'Hoạt động',
#         'created_date': 'Ngày tạo',
#         'category': 'Danh mục'
#     }
#     column_list = ['name', 'description', 'link', 'image', 'category']

#     form_overrides = {
#         'image': ImageUploadField
#     }

#     form_args = {
#         'image': {
#             'label': 'Ảnh đại diện',
#             'base_path': os.path.join(os.path.dirname(__file__), '..', 'static', 'images', 'imgProject'),
#             'url_relative_path': 'images/imgProject'  # KHÔNG thêm 'static' ở đây
#         }
#     }
    

#     form_extra_fields = {
#         'category': QuerySelectField(
#             'Danh mục',
#             query_factory=lambda: db.session.query(Category),
#             allow_blank=False,
#             widget=Select2Widget()
#         )
#     }


class CategoryView(AuthenticatedView):
    pass
class ServiceView(AuthenticatedView):
    can_view_details = True
    column_labels = {
        'name': 'Tên dịch vụ',
        'desctiption': 'Mô tả',
        'image': 'Ảnh đại diện',
    }
    form_extra_fields = {
        'image': ImageUploadField('Image', base_path='webgds/static/images/')
    }

class CategoryView(AuthenticatedView):
    can_view_details = True

class ProjectImageView(AuthenticatedView):
    column_labels = {
        'image': 'Ảnh ',
        'project': 'Dự án'
    }
    column_list = ['image', 'project']

    form_extra_fields = {
        'image': ImageUploadField('Image', base_path='webgds/static/images/imgDetailProject'),
        'project': QuerySelectField('Dự án',
                                     query_factory=lambda: db.session.query(Project),
                                     allow_blank=False,
                                     widget=Select2Widget()
                                     ),
        # 'category_id': HiddenField()
    }

class TeamView(AuthenticatedView):
    form_extra_fields = {
        'avatar': ImageUploadField('Image', base_path='webgds/static/images/avt'),
    }

class LogoutView(BaseView):
    @expose('/')
    def index(self):
        logout_user()
        return redirect('/admin')

    def is_accessible(self):
        return current_user.is_authenticated


# admin.add_view(CategoryView(Category, db.session))
# admin.add_view(CustomProjectView(Project, db.session))
# admin.add_view(ProjectImageView(ProjectImage, db.session))
# admin.add_view(AuthenticatedView(ProjectTag, db.session))
# admin.add_view(AuthenticatedView(Tag, db.session))
# admin.add_view(AuthenticatedView(About, db.session))
# admin.add_view(ServiceView(Service, db.session))
# admin.add_view(TeamView(Team, db.session))
# admin.add_view(AuthenticatedView(Contact, db.session))
# admin.add_view(AuthenticatedView(Subscriber, db.session))
# admin.add_view(LogoutView(name='Đăng xuất'))

admin.add_view(CategoryView(Category, db.session, name='Danh mục'))
admin.add_view(CustomProjectView(Project, db.session, name='Dự án'))
admin.add_view(ProjectImageView(ProjectImage, db.session, name='Hình ảnh trong dự án'))
admin.add_view(AuthenticatedView(ProjectTag, db.session, name='Tag dự án'))
admin.add_view(AuthenticatedView(Tag, db.session, name='Tag'))
admin.add_view(AuthenticatedView(About, db.session, name='Về chúng tôi'))
admin.add_view(ServiceView(Service, db.session, name='Dịch vụ'))
admin.add_view(TeamView(Team, db.session, name='Đội ngũ'))
admin.add_view(AuthenticatedView(Contact, db.session, name='Liên hệ'))
admin.add_view(AuthenticatedView(Subscriber, db.session, name='Người đăng ký'))
admin.add_view(LogoutView(name='Đăng xuất'))


