__author__ = 'Helium'

# Here, we are importing the auxiliary functions to clean or convert data
from MarketPlaces.Utilities.utilities import *

# Here, we are importing BeautifulSoup to search through the HTML tree
from bs4 import BeautifulSoup


#parses description pages, so takes html pages of description pages using soup object, and parses it for info it needs
#stores info it needs in different lists, these lists are returned after being organized
#@param: soup object looking at html page of description page
#return: 'row' that contains a variety of lists that each hold info on the description page
def lionmarketplace_description_parser(soup):
    # Fields to be parsed
    vendor = "-1"  # 0 *Vendor_Name
    success = "-1"  # 1 Vendor_Successful_Transactions
    rating_vendor = "-1"  # 2 Vendor_Rating
    name = "-1"  # 3 *Product_Name
    describe = "-1"  # 4 Product_Description
    CVE = "-1"  # 5 Product_CVE_Classification (Common Vulnerabilities and Exposures) dont worry about that much
    MS = "-1"  # 6 Product_MS_Classification (Microsoft Security) dont worry about that much
    category = "-1"  # 7 Product_Category
    views = "-1"  # 8 Product_Number_Of_Views
    reviews = "-1"  # 9 Product_Number_Of_Reviews
    rating_item = "-1"  # 10 Product_Rating
    addDate = "-1"  # 11 Product_AddedDate
    BTC = "-1"  # 12 Product_BTC_SellingPrice
    USD = "-1"  # 13 Product_USD_SellingPrice
    EURO = "-1"  # 14 Product_EURO_SellingPrice
    sold = "-1"  # 15 Product_QuantitySold
    left = "-1"  # 16 Product_QuantityLeft
    shipFrom = "-1"  # 17 Product_ShippedFrom
    shipTo = "-1"  # 18 Product_ShippedTo

    # vendor name
    try:
        temp = soup.find('div', {'class': 'btn-group'}).find('a').text
        vendor = (cleanString(temp.strip()))
    except:
        print('vendor')
        vendor = "-1"

    # table with info
    table = soup.find('table', {'class', 'table border-0 text-left table-borderless'})
    rows = table.findAll('tr')

    # successful transaction
    success = "-1"

    # vendor rating 5
    rating_vendor = '-1'


    # product name
    try:
        temp = soup.find('div', {'class', 'row'}).find('h2').text
        name = (cleanString(temp.strip()))
    except:
        name = '-1'
        print('product name')

    # product description
    try:
        temp = soup.find('div', {'class': "mt-4"}).findAll('p')
        temp = temp[1].text
        if "\n" in temp:
            temp = temp.replace("\n", " ")
            temp = temp.replace("\r", " ")
        describe = cleanString(temp.strip())
    except:
        describe="-1"
        print('describe')

    CVE = "-1"  # 5 Product_CVE_Classification (Common Vulnerabilities and Exposures) dont worry about that much
    MS = "-1"  # 6 Product_MS_Classification (Microsoft Security) dont worry about that much

    # product category
    try:
        temp = rows[1].find('strong').text
        category = cleanString(temp.strip())
    except:
        category = "-1"
        print('category')

    # product number of views
    views = "-1"
    reviews = "-1"  # 9 Product_Number_Of_Reviews
    rating_item = "-1"  # 10 Product_Rating
    addDate = "-1"  # 11 Product_AddedDate
    # BTC selling price box box-rounded mt-2
    BTC = "-1"

    # USD selling price
    try:
        temp = rows[2].find('strong').text
        if " $" in temp:
            temp = temp.replace(" $", "")
        elif "$" in temp:
            temp = temp.replace("$", "")
        USD = cleanString((temp.strip()))
    except:
        try:
            temp = soup.find('li').find('strong').text
            if " $" in temp:
                temp = temp.replace(" $", "")
            elif "$" in temp:
                temp = temp.replace("$", "")
            USD = cleanString((temp.strip()))
        except:
            print("USD")

    EURO = "-1"  # 14 Product_EURO_SellingPrice

    # product sold
    try:
        if (len(rows) <= 5):
            temp = rows[4].find('td').text
            string = cleanString(temp)
            if (string == 'Left/Sold'):
                temp = rows[4].findAll('td')
                temp = temp[1].findAll('span')

                # left
                temp2 = temp[1].text
                temp3 = temp[1].text

                if(" items" in temp2):
                    temp2 = temp2.replace(" items", "")
                if(" items" in temp3):
                    temp3 = temp3.replace(" items", "")

                sold = (cleanString(temp2.strip()))
                left = cleanString(temp3.strip())
            else:
                sold = '-1'
                left = "-1"
        else:
            sold = '-1'
            left = "-1"
    except:
        print("success")
        sold = '-1'
        left = "-1"

    shipFrom = "-1"  # 17 Product_ShippedFrom
    shipTo = "-1"  # 18 Product_ShippedTo

    # Populating the final variable (this should be a list with all fields scraped)
    row = (vendor, rating_vendor, success, name, describe, CVE, MS, category, views, reviews, rating_item, addDate,
           BTC, USD, EURO, sold, left, shipFrom, shipTo)

    # Sending the results
    return row


#parses listing pages, so takes html pages of listing pages using soup object, and parses it for info it needs
#stores info it needs in different lists, these lists are returned after being organized
#@param: soup object looking at html page of listing page
#return: 'row' that contains a variety of lists that each hold info on the listing page
def lionmarketplace_listing_parser(soup):
    # Fields to be parsed
    nm = 0  # *Total_Products (Should be Integer)
    mktName = "M00nkeyMarket"  # 0 *Marketplace_Name
    vendor = []  # 1 *Vendor y
    rating_vendor = []  # 2 Vendor_Rating
    success = []  # 3 Vendor_Successful_Transactions
    name = []  # 4 *Product_Name y
    CVE = []  # 5 Product_CVE_Classification (Common Vulnerabilities and Exposures) dont worry about this
    MS = []  # 6 Product_MS_Classification (Microsoft Security) dont worry about this
    category = []  # 7 Product_Category y
    describe = []  # 8 Product_Description
    views = []  # 9 Product_Number_Of_Views
    reviews = []  # 10 Product_Number_Of_Reviews
    rating_item = []  # 11 Product_Rating
    addDate = []  # 12 Product_AddDate
    BTC = []  # 13 Product_BTC_SellingPrice
    USD = []  # 14 Product_USD_SellingPrice y
    EURO = []  # 15 Product_EURO_SellingPrice
    sold = []  # 16 Product_QuantitySold
    qLeft = []  # 17 Product_QuantityLeft
    shipFrom = []  # 18 Product_ShippedFrom
    shipTo = []  # 19 Product_ShippedTo
    href = []  # 20 Product_Links

    listing = soup.findAll('div', {"class": "card-body"})

    # Populating the Number of Products
    nm = len(listing)

    for a in listing:

        row = a.findAll('p')
        # vendor
        try:
            temp = row[3].text
            vendor.append(cleanString(temp.strip()))
        except:
            vendor.append("-1")
            print('vendor')

        # vendor rating
        rating_vendor.append("-1")

        # successful transactions CHECK AGAIN HERE
        success.append("-1")

        # product name
        try:
            temp = a.find('a').text
            name.append(cleanString(temp.strip()))
        except:
            name.append("-1")
            print('product name')

        CVE.append('-1')
        MS.append('-1')

        # product category
        try:
            temp = row[2].text
            if "Category: " in temp:
                temp = temp.replace("Category: ", "")
            category.append(cleanString(temp.strip()))

        except:
            print("Error in product category")

        describe.append('-1')

        # product views
        views.append("-1")
        reviews.append('-1')  # 10 Product_Number_Of_Reviews
        rating_item.append('-1')  # 11 Product_Rating
        addDate.append('-1')  # 12 Product_AddDate

        # BTC
        BTC.append('-1')

        # USD
        try:
            temp = row[0].find('strong').text
            if ' $' in temp:
                temp = temp.replace(" $", "")
            USD.append(cleanString(temp.strip()))  # 14 Product_USD_SellingPrice
        except:
            print("USD")
            USD.append("-1")

        EURO.append("-1")  # 15 Product_EURO_SellingPrice

        # product sold
        sold.append("-1")

        qLeft.append('-1')  # 17 Product_QuantityLeft
        shipFrom.append('-1')  # 18 Product_ShippedFrom
        shipTo.append('-1')  # 19 Product_ShippedTo

        # href
        try:
            temp = a.find('a').get('href')
            href.append(temp)
        except:
            print('product name')

    # Populate the final variable (this should be a list with all fields scraped)
    return organizeProducts(mktName, nm, vendor, rating_vendor, success, name, CVE, MS, category, describe, views,
                            reviews, rating_item, addDate, BTC, USD, EURO, sold, qLeft, shipFrom, shipTo, href)


#called by the crawler to get description links on a listing page
#@param: beautifulsoup object that is using the correct html page (listing page)
#return: list of description links from a listing page
def lionmarketplace_links_parser(soup):

    # Returning all links that should be visited by the Crawler

    href = []
    listing = soup.findAll('div', {"class": "container d-flex justify-content-center"})

    for a in listing:
        bae = a.find('a', href=True)
        link = bae['href']
        href.append(link)

    return href