# Part of Odoo. See LICENSE file for full copyright and licensing details.

from unittest.mock import patch

from odoo import Command
from odoo.exceptions import ValidationError
from odoo.tests import Form, tagged

from odoo.addons.website.tools import MockRequest
from odoo.addons.website_sale_collect.tests.common import ClickAndCollectCommon
from odoo.addons.website_sale_stock.tests.common import WebsiteSaleStockCommon


@tagged('post_install', '-at_install')
class TestDeliveryCarrier(ClickAndCollectCommon, WebsiteSaleStockCommon):

    def test_prevent_publishing_when_no_warehouse(self):
        self.in_store_dm.is_published = False
        self.in_store_dm.warehouse_ids = [Command.clear()]
        with self.assertRaises(ValidationError):
            self.in_store_dm.is_published = True

    def test_same_company_for_delivery_method_and_warehouse(self):
        self.in_store_dm.company_id = self.company_id
        self.companyA = self.env['res.company'].create({'name': 'Company A'})
        self.warehouse_2 = self._create_warehouse(company_id=self.companyA.id)
        with self.assertRaises(ValidationError):
            self.in_store_dm.warehouse_ids = [Command.set([self.warehouse_2.id])]

    def test_creating_in_store_delivery_method_sets_integration_level_to_rate(self):
        new_in_store_carrier = self.env['delivery.carrier'].create({
            'name': "Test Carrier",
            'delivery_type': 'in_store',
            'product_id': self.dm_product.id,
        })
        self.assertEqual(new_in_store_carrier.integration_level, 'rate')

    def test_in_store_get_close_locations_returned_data(self):
        so = self._create_in_store_delivery_order()
        # Create a partner for a warehouse.
        wh_address_partner = self.env['res.partner'].create({
            **self.dummy_partner_address_values,
            'name': "Shop 1",
            'partner_latitude': 1.0,
            'partner_longitude': 2.0,
        })
        self.warehouse.partner_id = wh_address_partner.id
        self.warehouse.opening_hours = self.env['resource.calendar'].create({
            'name': 'Opening hours',
            'attendance_ids': [
                Command.create({
                    'name': 'Monday Morning',
                    'dayofweek': '0',
                    'hour_from': 8,
                    'hour_to': 12,
                    'day_period': 'morning',
                }),
                Command.create({
                    'name': 'Monday Lunch',
                    'dayofweek': '0',
                    'hour_from': 12,
                    'hour_to': 13,
                    'day_period': 'lunch',
                }),
                Command.create({
                    'name': 'Monday Afternoon',
                    'dayofweek': '0',
                    'hour_from': 13,
                    'hour_to': 17,
                    'day_period': 'afternoon',
                }),
            ],
        })

        with patch(
            'odoo.addons.base_geolocalize.models.res_partner.ResPartner.geo_localize',
            return_value=True
        ), MockRequest(self.env, website=self.website, sale_order_id=so.id):
            locations = self.in_store_dm._in_store_get_close_locations(wh_address_partner)
            self.assertEqual(
                locations, [{
                    'id': self.warehouse.id,
                    'name': wh_address_partner['name'].title(),
                    'street': wh_address_partner['street'].title(),
                    'city': wh_address_partner.city.title(),
                    'zip_code': wh_address_partner.zip,
                    'state': wh_address_partner.state_id.code,
                    'country_code': wh_address_partner.country_code,
                    'latitude': wh_address_partner.partner_latitude,
                    'longitude': wh_address_partner.partner_longitude,
                    'additional_data': {'in_store_stock': {'in_stock': True}},
                    'opening_hours': {
                        '0': ['08:00 - 12:00', '13:00 - 17:00'],
                        '1': [],
                        '2': [],
                        '3': [],
                        '4': [],
                        '5': [],
                        '6': [],
                    },
                    'distance': 0.0,
                }]
            )
