from bs4 import BeautifulSoup
from dateutil.relativedelta import relativedelta
from uk_bin_collection.uk_bin_collection.common import *
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass


# import the wonderful Beautiful Soup and the URL grabber
class CouncilClass(AbstractGetBinDataClass):
    """
    Concrete classes have to implement all abstract operations of the
    base class. They can also override some operations with a default
    implementation.
    """

    def parse_data(self, page: str, **kwargs) -> dict:
        data = {"bins": []}

        # Get UPRN and postcode from commandline
        user_uprn = kwargs.get("uprn")
        user_postcode = kwargs.get("postcode")
        check_postcode(user_postcode)
        check_uprn(user_uprn)

        # Pass in form data and make the POST request
        headers = {
            "authority": "waste.barnsley.gov.uk",
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
            "accept-language": "en-GB,en;q=0.9",
            "cache-control": "no-cache",
            "content-type": "application/x-www-form-urlencoded",
            "origin": "https://waste.barnsley.gov.uk",
            "pragma": "no-cache",
            "referer": "https://waste.barnsley.gov.uk/ViewCollection/SelectAddress",
            "sec-ch-ua": '"Chromium";v="118", "Opera GX";v="104", "Not=A?Brand";v="99"',
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-platform": '"Windows"',
            "sec-fetch-dest": "document",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "same-origin",
            "sec-fetch-user": "?1",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.118 Safari/537.36",
        }
        form_data = {
            "personInfo.person1.HouseNumberOrName": "",
            "personInfo.person1.Postcode": f"{user_postcode}",
            "personInfo.person1.UPRN": f"{user_uprn}",
            "person1_SelectAddress": "Select address",
        }
        response = requests.post(
            "https://waste.barnsley.gov.uk/ViewCollection/SelectAddress",
            headers=headers,
            data=form_data,
        )
        soup = BeautifulSoup(response.text, features="html.parser")
        soup.prettify()

        if response.status_code != 200:
            raise ConnectionRefusedError(
                "Error getting results from website! Please open an issue on GitHub!"
            )

        # Parse the response, getting the top box first and then tabled collections after
        results = soup.find("div", {"class": "panel"}).find_all("fieldset")[0:2]
        heading = results[0].find_all("p")[1:3]
        bin_text = heading[1].text.strip() + " bin"

        if heading[0].text == "Today":
            bin_date = datetime.today()
        elif heading[0].text == "Tomorrow":
            bin_date = datetime.today() + relativedelta(days=1)
        else:
            bin_date = datetime.strptime(heading[0].text, "%A, %B %d, %Y")

        dict_data = {
            "type": bin_text,
            "collectionDate": bin_date.strftime(date_format),
        }
        data["bins"].append(dict_data)

        results_table = [row for row in results[1].find_all("tbody")[0] if row != "\n"]
        for row in results_table:
            text_list = [item.text.strip() for item in row.contents if item != "\n"]
            bin_text = text_list[1] + " bin"

            dict_data = {
                "type": bin_text,
                "collectionDate": bin_date.strftime(date_format),
            }
            data["bins"].append(dict_data)

        return data
