# -*- coding: utf-8 -*-
# Part of Biztech Consultancy. See LICENSE file for full copyright and licensing details.

import math
import werkzeug
from openerp import api, fields, models, _
from openerp.http import request
from openerp.addons.website_sale.controllers import main


class WebsiteMenu(models.Model):
    _inherit = "website.menu"

    is_megamenu = fields.Boolean(string='Es Megamenú...?')
    megamenu_type = fields.Selection([('2_col', '2 Columnas'),
                                      ('3_col', '3 Columnas'),
                                      ('4_col', '4 Columnas')],
                                     default='3_col',
                                     string="Tipo de Mega Menu")
    megamenu_bg = fields.Boolean(string='Colocar Fondo al Megamenu', default=False)
    megamenu_bg_img_color = fields.Selection([('bg_img', 'Imágen de Fondo'),
                                              ('bg_color', 'Color de Fondo')],
                                             default='bg_img',
                                             string="Seleccionar Fondo para el Mega Menu")
    megamenu_bg_image = fields.Binary(string="Imágen de Fondo para el Mega Menú")
    megamenu_bg_color = fields.Char(string="Color de Fondo para el Mega Menú",
                                    default='#ccc',
                                    help="Background color for megamenu, for setting background color you have to pass hexacode here.")
    category_slider = fields.Boolean(string='Mostrar Slider de Categorias en el Menú', default=False)
    carousel_header_name = fields.Char(string="Título el Slider",
                                       default="Lanzamientos", translate=True,
                                       help="Nombre que se Mostrara en el Encabezado del Slider de Categorias")
    category_slider_position = fields.Selection([('left', 'Izquierda'), ('right', 'Derecha')],
                                                default='left', string="Posición del Slider")
    menu_icon = fields.Boolean(string='Mostrar Icono en el Menu', default=False)
    menu_icon_image = fields.Binary(string="Icono del Menu ", help="Icono para tu menu")

    display_menu_footer = fields.Boolean(string="Mostrar pie de página para tu menu", default=False,
                                         help="Para Mostrar pie de página en el megamenu")
    menu_footer = fields.Html(string="Contenido del Pie de Página",
                              help="Nombre del Píe de Página para el meganenu")
    customize_menu_colors = fields.Boolean(string='Personalizar Colores del Menu', default=False)
    main_category_color = fields.Char(string='Color Principal de la Categoria',
                                      help="Colocar color para la categoria principal del menu")
    sub_category_color = fields.Char(string='Color para la Sub Categoria',
                                     help="Colocar color para la subcategoria")


class website(models.Model):
    _inherit = 'website'

    # For Multi image
    thumbnail_panel_position = fields.Selection([
        ('left', 'Izquierda'),
        ('right', 'Derecha'),
        ('bottom', 'Fondo'),
    ], default='left',
        string='Posición del Panel de Miniaturas',
        help="Seleccione la posición en la que desea mostrar el panel de miniaturas de multi-imagenes.")
    interval_play = fields.Char(string='Intervalo de Imágenes del Slide', default='5000',
                                help='Con este campo se puede establecer el tiempo o intervalo entre dos imágenes.')
    enable_disable_text = fields.Boolean(string='Activar el panel de texto',
                                         default=True,
                                         help='Activar/Desactivar el texto que aparece en la imagen en imagen de varias.')
    color_opt_thumbnail = fields.Selection([
        ('default', 'Predeterminado'),
        ('b_n_w', 'Blanco y Negro'),
        ('sepia', 'Sepia'),
        ('blur', 'Desenfoque'), ],
        default='default',
        string="Efecto sobre las miniaturas")
    no_extra_options = fields.Boolean(string='Efectos sobre Sliders',
                                      default=True,
                                      help="Slider con todas las opciones para la siguiente, anterior, reproducción, pausa, pantalla completa, ocultar / mostrar el panel de miniaturas.")
    change_thumbnail_size = fields.Boolean(string="Cambiar Tamaño de Miniaturas", default=False)
    thumb_height = fields.Char(string='Altura de Imágen', default=50)
    thumb_width = fields.Char(string='Ancho de Imágen', default=88)

    # For Sort By
    enable_sort_by = fields.Boolean(string='Habilitar opción de clasificación de productos',
                                    help='Para habilitar la característica de ordenación del producto en el sitio web.',
                                    default=True)

    # For first last pager
    enable_first_last_pager = fields.Boolean(string="Habilitar primera y ultima paginación", default=True,
                                             help="Activar esta casilla para mostrar el boton 'Primera' y el botón 'Última' en el paginador en el sitio web.")
    # Product per grid
    product_display_grid = fields.Selection([('2', '2'), ('3', '3'), ('4', '4')],
                                            default='3', string='Producto por cuadrícula', help="Mostrar Nro. de productos por línea en el sitio web de la red de productos.")

    # For first last pager
    def get_pager_selection(self):
        prod_per_page = self.env['product.per.page'].search([])
        prod_per_page_no = self.env['product.per.page.no'].search([])
        values = {
            'name': prod_per_page.name,
            'page_no': prod_per_page_no,
        }
        return values

    def get_current_pager_selection(self):
        if request.session.get('default_paging_no'):
            return int(request.session.get('default_paging_no'))
        else:
            return main.PPG

    def pager(self, cr, uid, ids, url, total, page=1, step=30, scope=5, url_args=None, context=None):
        res = super(website, self). pager(cr, uid, ids, url=url,
                                          total=total,
                                          page=page,
                                          step=step,
                                          scope=scope,
                                          url_args=url_args,
                                          context=context)
        # Compute Pager
        page_count = int(math.ceil(float(total) / step))

        page = max(1, min(int(page if str(page).isdigit() else 1), page_count))
        scope -= 1

        pmin = max(page - int(math.floor(scope/2)), 1)
        pmax = min(pmin + scope, page_count)

        if pmax - pmin < scope:
            pmin = pmax - scope if pmax - scope > 0 else 1

        def get_url(page):
            _url = "%s/page/%s" % (url, page) if page > 1 else url
            if url_args and not url_args.get('tag') and not url_args.get('range1') and not url_args.get('range2') and not url_args.get('max1') and not url_args.get('min1') and not url_args.get('sort_id'):
                _url = "%s?%s" % (_url, werkzeug.url_encode(url_args))
            return _url
        res.update({
            # Overrite existing
            "page_start": {
                'url': get_url(pmin),
                'num': pmin
            },
            "page_previous": {
                'url': get_url(max(pmin, page - 1)),
                'num': max(pmin, page - 1)
            },
            "page_next": {
                'url': get_url(min(pmax, page + 1)),
                'num': min(pmax, page + 1)
            },
            "page_end": {
                'url': get_url(pmax),
                'num': pmax
            },
            'page_first': {
                'url': get_url(1),
                'num': 1
            },
            'page_last': {
                'url': get_url(int(res['page_count'])),
                'num': int(res['page_count'])
            },
            'pages': [
                {'url': get_url(page), 'num': page}
                for page in xrange(pmin, pmax+1)
            ]
        })
        return res

    # For multi image
    @api.multi
    def get_multiple_images(self, product_id=None):
        product_img_data = False
        if product_id:
            self.env.cr.execute(
                "select id from biztech_product_images where product_tmpl_id=%s and more_view_exclude IS NOT TRUE order by sequence", ([product_id]))
            product_ids = map(lambda x: x[0], self.env.cr.fetchall())
            if product_ids:
                product_img_data = self.env['biztech.product.images'].browse(
                    product_ids)
        return product_img_data

    # For brands
    def sale_product_domain(self, cr, uid, ids, context=None):
        domain = super(website, self).sale_product_domain(cr, uid, ids=ids,
                                                          context=context)
        if 'brand_id' in request.context:
            domain.append(
                ('product_brand_id', '=', request.context['brand_id']))
        return domain

    # For product tags feature
    def get_product_tags(self):
        product_tags = self.env['biztech.product.tags'].search([])
        return product_tags

    # For Sorting products
    def get_sort_by_data(self):
        request.session['product_sort_name'] = ''
        sort_by = self.env['biztech.product.sortby'].search([])
        return sort_by

    # For setting current sort list
    def set_current_sorting_data(self):
        sort_name = request.session.get('product_sort_name')
        return sort_name

    # For megamenu
    @api.multi
    def get_public_product_category(self, submenu):
        categories = self.env['product.public.category'].search([('parent_id', '=', False),
                                                                 ('include_in_megamenu',
                                                                  '!=', False),
                                                                 ('menu_id', '=', submenu.id)],
                                                                order="sequence")
        return categories

    def get_public_product_child_category(self, children):
        child_categories = []
        for child in children:
            categories = self.env['product.public.category'].search([
                ('id', '=', child.id),
                ('include_in_megamenu', '!=', False)], order="sequence")
            if categories:
                child_categories.append(categories)
        return child_categories


class WebsiteConfigSettings(models.TransientModel):

    _inherit = 'website.config.settings'

    # For multi image
    thumbnail_panel_position = fields.Selection([
        ('left', 'Izquierda'),
        ('right', 'Derecha'),
        ('bottom', 'Fondo')],
        string='Posición del Panel de Miniaturas',
        related='website_id.thumbnail_panel_position',
        help="Select the position where you want to display the thumbnail panel in multi image.")
    interval_play = fields.Char(string='Intervalo de Desplazamiento del Slide',
                                related='website_id.interval_play',
                                help='Con este campo se puede establecer el tiempo de intervalo entre dos imágenes.')
    enable_disable_text = fields.Boolean(string='Activar Panel de Texto',
                                         related='website_id.enable_disable_text',
                                         help='Activar/Desactivar el texto que aparecera en el sitio web en multi-imagenes.')
    color_opt_thumbnail = fields.Selection([
        ('default', 'Default'),
        ('b_n_w', 'Blanco y Negro'),
        ('sepia', 'Sepia'),
        ('blur', 'Desenfoque')],
        related='website_id.color_opt_thumbnail',
        string="Efectos sobre las Miniaturas")
    no_extra_options = fields.Boolean(string='Efectos del Slider',
                                      # default=True,
                                      related='website_id.no_extra_options',
                                      help="Slider con las opciones para  siguiente, anterior, reproducción, pausa, pantalla completa, ocultar/mostrar el panel de miniaturas.")
    change_thumbnail_size = fields.Boolean(string="Cambiar Tamaño de las Miniaturas",
                                           related="website_id.change_thumbnail_size"
                                           )
    thumb_height = fields.Char(string='Altura de Miniatura',
                               related="website_id.thumb_height"
                               )
    thumb_width = fields.Char(string='Ancho de Miniatura',
                              related="website_id.thumb_width"
                              )

    # For Sort By
    enable_sort_by = fields.Boolean(related="website_id.enable_sort_by", string='Habilitar opción de clasificación de productos',
                                    help='For enabling product sorting feature in website.',
                                    default=True)

    # For first last pager
    enable_first_last_pager = fields.Boolean(related='website_id.enable_first_last_pager',
                                             string="Habilitar boton Primera y boton Ultima Página", default=True,
                                             help="Activar este checkbox para el boton 'Primero' y boton'Ultimo' en el sitio web.")
    # Product per grid
    product_display_grid = fields.Selection(related='website_id.product_display_grid',
                                            default='3', string='Producto por cuadrícula', help="Muestra el Nro. de productos por línea en el sitio web de la red de productos.")