import sys
import os

try:
    import http.client as httplib
except ImportError:
    print("error: no httplib support")

try:
    import ssl
except ImportError:
    print("error: no ssl support")

try:
    import urllib.request as urllib2
except ImportError:
    import urllib2

try:
    import urllib.parse as urlparse
except ImportError:
    import urlparse

from Constants import Constants

DirName = None
CurrIdx = 0
Conn = None
Kind = 0

######### URL 이미지저장 ############
def downImg(img_url, filename):
    global DirName
    global CurrIdx
    global Conn
    global Kind

    file_path = "%s%s" % (os.getcwd() + '\\', filename)  # 현재경로 구함
    downloaded_image = open(file_path, "wb")  ##3.4

    tryCount = 0
    while (tryCount < Constants.URL_TRYCOUNT_MAX):
        tryCount += 1  # 시도수 증가
        isSuc = False

        try:
            image_on_web = urllib2.urlopen(img_url, timeout=Constants.PAGE_IMAGE_OPEN_TIMOUT_SEC)
            isSuc = True
        except Exception as e:
            print(e)
            print("다운로드 지연 - 번호 : " + str(CurrIdx) + " , 시도횟수 : " + str(tryCount))

        # 성공시 루프 빠져나감
        if isSuc == True:
            break

    # 모두 실패시 에러메세지 표시
    if (tryCount >= Constants.URL_TRYCOUNT_MAX and isSuc == False):
        print("*** 다운로드 에러 : 폴더명 : " + DirName + " , 번호 : " + str(CurrIdx))
        return -1

    try:
        while True:
            buf = image_on_web.read(100000000)
            if len(buf) == 0:
                break
            downloaded_image.write(buf)

        downloaded_image.close()
        image_on_web.close()
    except Exception as e:
        print(e)
        print("**** 다운로드 에러. 폴더명 : " + DirName + " , 번호 : " + str(CurrIdx))
        print(" 나중에 다시 시도해 보세요")

    return file_path

### URL문자조정 컷,붙임
def urlCut(strOri):
    length = len(strOri)
    if length > 0:
        lastChar = strOri[length-1]
        if lastChar == '/':
            strOri = strOri[0:length-1]

        # 앞에 'http://' 있으면 삭제
        frontStr = strOri[0:8]        # 0~7 까지
        if frontStr == 'https://':
            strOri = strOri[8:]

        frontStr = strOri[0:7]
        if frontStr == 'http://':
            strOri = strOri[7:]

    return strOri

##### 큰 작업 #####
def work(workUrl):
    global DirName
    global CurrIdx
    global Conn
    global Kind
    CurrIdx = 0

    tryCount = 0
    isSuc = False
    print(" --- 연결 시도 ---")
    while (tryCount < Constants.CONN_TRYCOUNT_MAX):
        tryCount += 1  # 시도수 증가
        #커넥션 생성 시도(메인 url에)
        try:
            # 앞에 'http://' 있으면 삭제
            srtUrl = urlCut(workUrl)
            srtUrlMaster = srtUrl[0:16]  # 맨앞주소만        www.gamemeca.com
            Conn = httplib.HTTPSConnection(srtUrlMaster)

            isSuc = True
        except Exception as e:
            print(e)
            print("*** 연결 지연. 시도횟수 : " + str(tryCount))

        # 성공시 루프 빠져나감
        if isSuc == True:
            ret = 1
            break

    #작은작업 1,2 수행
    if ret >= 0:            #커넥션 성공시만 subwork1 수행
        ret = subWork1(workUrl)

    if ret >= 0:            #subwork1 성공시만 subwork2 수행
        subWork2(workUrl)

############## subwork1 : 페이지url들 얻기 ###################
def subWork1(workUrl):
    global DirName
    global CurrIdx
    global Conn
    global Kind
    srtUrl = workUrl
    DirName = ""
    Kind = 0            # 0 = 게임챔프 ,  1 = PC챔프

    tryCount = 0
    while(tryCount < Constants.URL_TRYCOUNT_MAX):
        tryCount += 1       # 시도수 증가
        isSuc = False
        try:
            # 앞에 'http://' 있으면 삭제
            srtUrl = urlCut(srtUrl)
            srtUrlMaster = srtUrl[0:16]   #맨앞주소만    www.gamemeca.com (위에서 이미 접속하였음)
            srtUrl = srtUrl[16:]    # 맨앞주소 제외한 /부터

            # params = urllib.parse.urlencode({'p': 1})
            # Conn.request("GET", srtUrl, params)
            Conn.request("GET", srtUrl)
            resp = Conn.getresponse()
            # print(resp.status, resp.reason)
            webPage = resp.read()

            isSuc = True
        except Exception as e:
            print(e)
            print("*** 페이지 URL 접속 지연. 시도횟수 : " + str(tryCount))   # textBrowser에 에러 표시

        #성공시 루프 빠져나감
        if isSuc == True:
            break

    #모두 실패시 에러메세지 표시
    if(tryCount >= Constants.URL_TRYCOUNT_MAX and isSuc == False):
        print("*** 페이지 URL 접속 실패 - 폴더명 : " + DirName)
        return -1

    ### 바이트 페이지 읽기 ###
    bytesHtml = webPage

    ### 바이트 페이지를 String으로 디코드 ###
    try:
        strHtml = str(bytesHtml, encoding='utf-8')     #bytes to str
    except Exception as e:
        print("Get strHtml Exception\n")
        print(e)
        try:
            strHtml = str(bytesHtml, encoding='euc-kr')     #bytes to str    한국홈페이지는 이걸로 해야 글씨안깨지는듯
        except Exception as e:
            print("Try Enc euc-kr Exception\n")
            print(e)

    ### 타이틀명 얻고 폴더 생성 ###
    titleStr = "Default Title"
    dirNo = 0       # 폴더명 변경용

    temp1 = strHtml.find("게임챔프 - ")        #id 찾기
    if temp1 != -1:
        Kind = 0
    else :
        temp1 = strHtml.find("PC챔프 - ")  # id 찾기
        if temp1 != -1:
            Kind = 1
        else:
            temp1 = strHtml.find("Net POWER - ")  # id 찾기
            if temp1 != -1:
                Kind = 2
            else:
                temp1 = strHtml.find("넷파워 - ")  # id 찾기
                if temp1 != -1:
                    Kind = 3
                else:
                    print("지원하지 않는 종류입니다.")
                    return -1

    temp2 = strHtml.find("</title>", temp1)        # 찾은곳부터
    if Kind == 0:
	    titleStr = strHtml[temp1+7:temp2]
    elif Kind == 1:
        titleStr = strHtml[temp1+7:temp2]
    elif Kind == 2:
        titleStr = strHtml[temp1+12:temp2]
    elif Kind == 3:
        titleStr = strHtml[temp1+6:temp2]

    temp3 = titleStr.find("년")        # 찾은곳부터

    if temp3 != -1:
        titleStr = titleStr[0:temp3+1] + '_' + titleStr[temp3+2:]       #가운데공백을 _로 치환

        temp1 = titleStr.find("년")
        temp2 = titleStr.find("월", temp1)  # 찾은곳부터
        monthStr = titleStr[temp1+2:temp2]  # 월 숫자 가져옴

        if len(monthStr) < 2 :    # 1~9 월은 0하나 더 넣음
        	titleStr = titleStr[0:temp3+2] + '0' + titleStr[temp3+2:]

    if Kind == 0:
        titleStr = "[게임챔프] " + titleStr
    elif Kind == 1:
        titleStr = "[PC CHAMP] " + titleStr
    elif Kind == 2:
        titleStr = "[Net Power] " + titleStr
    elif Kind == 3:
        titleStr = "[Net Power] " + titleStr

    DirName = titleStr.strip()

    # === 폴더생성 불가능 문자 치환
    try:
        DirName = DirName.replace('/', '_')
        DirName = DirName.replace('?', '_')
        DirName = DirName.replace(':', '_')
        DirName = DirName.replace('&quot;', '\'\'')  # 쌍따옴표
        DirName = DirName.replace('&#039;', '\'')  # 따옴표
        DirName = DirName.replace('&ndash;', '-')  # 대쉬
        DirName = DirName.replace('|', '_')
        DirName = DirName.replace('\\', '_')
        DirName = DirName.replace('*', '_')
        DirName = DirName.replace('<', '_')
        DirName = DirName.replace('>', '_')
    except Exception as e:
        print("Make Folder Exception 2\n")
        print(e)

    #=== 폴더 있으면 이름변경 ===
    while os.path.isdir(DirName) :
        DirName = titleStr + '_' + '{:0=2}'.format(dirNo)
        dirNo = dirNo + 1
    #=== 폴더 생성 ===
    try:
        os.mkdir(DirName)
    except  Exception as e:
        print(e)
        print("*** 폴더생성 실패 : " + DirName)
        return -1

    print(DirName + " 다운 시작")   # title명 표시

    return 0

################ subwork2 : 다운 #################
def subWork2(strUrl):
    global DirName
    global CurrIdx
    global Conn
    global Kind
    FrontNo = 0     # 이미지 번호 맨앞에 붙임.
    failCount = 0

    while True:
        imgNo = 0
        CurrIdx = CurrIdx+1
        # print("Img Num : " + CurrIdx)        # 현재다운중인 이미지 번호 출력
        FrontNo += 1;

        if failCount >= 3:
            break

        failCount = 0

        while failCount < 3:
            try:
                #=== image URL 얻기 ===
                temp1 = strUrl.find("ym=")
                numStr = strUrl[temp1+3:]        #월-호
                if Kind == 0:
                    imageUrl = "https://www.gamemeca.com/magazine/file.php?m=b&title=gamechamp&ym=" + numStr + "&p=" + str(FrontNo)
                elif Kind == 1:
                    imageUrl = "https://www.gamemeca.com/magazine/file.php?m=b&title=pcchamp&ym=" + numStr + "&p="  + str(FrontNo)
                elif Kind == 2:
                    imageUrl = "https://www.gamemeca.com/magazine/file.php?m=b&title=netpower&ym=" + numStr + "&p="  + str(FrontNo)
                elif Kind == 3:
                    imageUrl = "https://www.gamemeca.com/magazine/file.php?m=b&title=netpower&ym=" + numStr + "&p="  + str(FrontNo)

                #=== 파일명 얻기 ===
                fileName = DirName + '/' + DirName + '_' + '{:0=3}'.format(FrontNo) + ".jpg"      # 뒤에 '_이미지번호' 붙임

                ## 이미 존재하면 안겹칠때까지 다른이름으로  _파일명(번호) --> 그냥 덮어씌우는 걸로
                # while os.path.isfile(fileName):
                #     fileName = DirName + '/' + DirName + '_' + '{:0=3}'.format(FrontNo) + ' (' + '{:0=3}'.format(imgNo) + ')' + ".jpg"    # 숫자를 문자로. 3자리까지 0채움.
                #     imgNo = imgNo + 1

                ## 저장 (curridx는 시작시 증가시킴)
                downImg(imageUrl, fileName)

                break;
            except  Exception as e:
                print(e)
                failCount += 1

        n = os.path.getsize(fileName)
        if(n == 0):         # 파일 사이즈 0이면 끝 판단.
            print(" !!! 완료 : " + DirName + " !!!")
            os.remove(fileName)     # 지우고 종료
            break;

##===== main func ==========
def main(argv = None):
    inputFile = open('URL.txt', 'r')

    for line in inputFile.readlines():
        temp1 = line.find("www")        # 검사1
        if temp1 != -1:
            temp1 = line.find("\n")        #id 찾기
            if temp1 != -1:
                work(line[0:temp1])
            else:
                work(line)

    print(" ********** 작업 완료. 엔터키를 입력하세요 **********")
    input()

## main
if __name__ == '__main__':
    sys.exit(main())        # 실행 & 종료