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

import ast

from odoo import api, models, _


class SurveyTemplate(models.Model):
    """This model defines additional actions on the 'survey.survey' model that
       can be used to load a survey sample. The model defines a sample for each
       survey type:
       (1) survey: A feedback form
       (2) assessment: A certification
       (3) live_session: A live presentation
       (4) custom: An empty survey
    """

    _inherit = 'survey.survey'

    @api.model
    def action_load_sample_survey(self):
        return self.env['survey.survey'].create({
            'survey_type': 'survey',
            'title': _('Feedback Form'),
            'description': '<br>'.join([
                _('Please complete this very short survey to let us know how satisfied your are with our products.'),
                _('Your responses will help us improve our product range to serve you even better.')
            ]),
            'description_done': _('Thank you very much for your feedback. We highly value your opinion!'),
            'progression_mode': 'number',
            'questions_layout': 'page_per_question',
            'question_and_page_ids': [
                (0, 0, { # survey.question
                    'title': _('How frequently do you use our products?'),
                    'question_type': 'simple_choice',
                    'constr_mandatory': True,
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('Often (1-3 times per week)')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Rarely (1-3 times per month)')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Never (less than once a month)')
                        })
                    ]
                }),
                (0, 0, { # survey.question
                    'title': _('How many orders did you pass during the last 6 months?'),
                    'question_type': 'numerical_box',
                }),
                (0, 0, { # survey.question
                    'title': _('How likely are you to recommend the following products to a friend?'),
                    'question_type': 'matrix',
                    'matrix_subtype': 'simple',
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('Unlikely')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Neutral')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Likely')
                        }),
                    ],
                    'matrix_row_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('Red Pen')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Blue Pen')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Yellow Pen')
                        })
                    ]
                })
            ]
        }).action_show_sample()

    @api.model
    def action_load_sample_assessment(self):
        survey_values = {
            'survey_type': 'assessment',
            'title': _('Certification'),
            'certification': True,
            'access_mode': 'token',
            'is_time_limited': True,
            'time_limit': 15, # 15 minutes
            'is_attempts_limited': True,
            'attempts_limit': 1,
            'progression_mode': 'number',
            'scoring_type': 'scoring_without_answers',
            'users_can_go_back': True,
            'description': ''.join([
                _('Welcome to this Odoo certification. You will receive 2 random questions out of a pool of 3.'),
                '(<span style="font-style: italic">',
                _('Cheating on your neighbors will not help!'),
                '</span> 😁).<br>',
                _('Good luck!')
            ]),
            'description_done': _('Thank you. We will contact you soon.'),
            'questions_layout': 'page_per_section',
            'questions_selection': 'random',
            'question_and_page_ids': [
                (0, 0, { # survey.question
                    'title': _('Odoo Certification'),
                    'is_page': True,
                    'question_type': False,
                    'random_questions_count': 2
                }),
                (0, 0, { # survey.question
                    'title': _('What does "ODOO" stand for?'),
                    'question_type': 'simple_choice',
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('It\'s a Belgian word for "Management"')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Object-Directed Open Organization')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Organizational Development for Operation Officers')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('It does not mean anything specific'),
                            'is_correct': True,
                            'answer_score': 10
                        }),
                    ]
                }),
                (0, 0, { # survey.question
                    'title': _('On Survey questions, one can define "placeholders". But what are they for?'),
                    'question_type': 'simple_choice',
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('They are a default answer, used if the participant skips the question')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('It is a small bit of text, displayed to help participants answer'),
                            'is_correct': True,
                            'answer_score': 10
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('They are technical parameters that guarantees the responsiveness of the page')
                        })
                    ]
                }),
                (0, 0, { # survey.question
                    'title': _('What does one need to get to pass an Odoo Survey?'),
                    'question_type': 'simple_choice',
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('It is an option that can be different for each Survey'),
                            'is_correct': True,
                            'answer_score': 10
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('One needs to get 50% of the total score')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('One needs to answer at least half the questions correctly')
                        })
                    ]
                }),
            ]
        }
        mail_template = self.env.ref('survey.mail_template_certification', raise_if_not_found=False)
        if mail_template:
            survey_values.update({
                'certification_mail_template_id': mail_template.id
            })
        return self.env['survey.survey'].create(survey_values).action_show_sample()

    @api.model
    def action_load_sample_live_session(self):
        return self.env['survey.survey'].create({
            'survey_type': 'live_session',
            'title': _('Live Session'),
            'description': '<br>'.join([
                _('How good of a presenter are you? Let\'s find out!'),
                _('But first, keep listening to the host.')
            ]),
            'description_done': _('Thank you for your participation, hope you had a blast!'),
            'progression_mode': 'number',
            'scoring_type': 'scoring_with_answers',
            'questions_layout': 'page_per_question',
            'session_speed_rating': True,
            'session_speed_rating_time_limit': 90,
            'question_and_page_ids': [
                (0, 0, { # survey.question
                    'title': _('What is the best way to catch the attention of an audience?'),
                    'question_type': 'simple_choice',
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('Speak softly so that they need to focus to hear you')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Use a fun visual support, like a live presentation'),
                            'is_correct': True,
                            'answer_score': 20
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Show them slides with a ton of text they need to read fast')
                        })
                    ]
                }),
                (0, 0, { # survey.question
                    'title': _('What is a frequent mistake public speakers do?'),
                    'question_type': 'simple_choice',
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('Practice in front of a mirror')
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Speak too fast'),
                            'is_correct': True,
                            'answer_score': 20
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('Use humor and make jokes')
                        })
                    ]
                }),
                (0, 0, { # survey.question
                    'title': _('Why should you consider making your presentation more fun with a small quiz?'),
                    'question_type': 'multiple_choice',
                    'suggested_answer_ids': [
                        (0, 0, { # survey.question.answer
                            'value': _('It helps attendees focus on what you are saying'),
                            'is_correct': True,
                            'answer_score': 20
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('It is more engaging for your audience'),
                            'is_correct': True,
                            'answer_score': 20
                        }),
                        (0, 0, { # survey.question.answer
                            'value': _('It helps attendees remember the content of your presentation'),
                            'is_correct': True,
                            'answer_score': 20
                        })
                    ]
                }),

            ]
        }).action_show_sample()

    @api.model
    def action_load_sample_custom(self):
        return self.env['survey.survey'].create({
            'survey_type': 'custom',
            'title': '',
        }).action_show_sample()

    def action_show_sample(self):
        action = self.env['ir.actions.act_window']._for_xml_id('survey.action_survey_form')
        action['views'] = [[self.env.ref('survey.survey_survey_view_form').id, 'form']]
        action['res_id'] = self.id
        action['context'] = dict(ast.literal_eval(action.get('context', {})),
            create=False
        )
        return action
