//
//  PhotoItem.swift
//  PaiAi
//
//  Created by FFIB on 2017/10/9.
//  Copyright © 2017年 yb. All rights reserved.
//

import Foundation
import ObjectMapper
import RxDataSources

extension DateTransform {
    open func transformFromJSON(_ value: Any?) -> Date? {
        if let timeInt = value as? Double {
            return Date(timeIntervalSince1970: TimeInterval(timeInt) / 1000)
        }
        
        if let timeStr = value as? String {
            return Date(timeIntervalSince1970: TimeInterval(atof(timeStr)) / 1000)
        }
        
        return nil
    }
}

public struct PhotoItem: JSONCode {
    public var avatar = ""
    public var nickname = ""
    
    public var comment_num = 0
    public var thumbup_num = 0
    
    public var group_avatar = ""
    public var group_default_avatar = 0
    public var group_name = ""
    
    
    public var photo_thumbnail_url = ""
    public var photo_thumbnail2_url = ""
    public var photo_url = ""
    public var photo_share_url = ""
    public var thumbup = false
    public var murl = ""
    public var rurl = ""
    
    public var create_at = ""
    public var create_at_time_interval = ""
    
    public var user_id = ""
    
    public var porder: [String: String] = [:]
    public var origin_expired_stamps: Double = 0
    public var time_stamps: Date?
    public var isExpire = true
    public var sizeCache = CGSize(width: 0, height: 0)
    public var display_payment_btn = 0
    
    var created_at: Date?
    
    var photo_thumbnail2_w = 0
    var photo_thumbnail2_h = 0
    var photo_thumbnail_w = 0
    var photo_thumbnail_h = 0
    var photo_h = 0
    var photo_w = 0
    
    var photo_from = 0
    var photo_id = ""
    
    var group_from = 0
    var group_id = ""
    
    init() {}
    
    public init(json: [String: AnyObject]) {
        self.init(map: Map(mappingType: .fromJSON, JSON: json))
    }
    
    public static func empty() -> PhotoItem {
        return PhotoItem()
    }
}

extension PhotoItem: Mappable {
    public init(map: Map) {
        mapping(map: map)
    }
    mutating public func mapping(map: Map) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
        created_at               <-  (map["created_at"], DateFormatterTransform(dateFormatter:dateFormatter))
        avatar                  <-  map["avatar"]
        comment_num             <-  map["comment_num"]
        group_avatar            <-  map["group_avatar"]
        group_default_avatar    <-  map["group_default_avatar"]
        group_from              <-  map["group_from"]
        group_id                <-  map["group_id"]
        group_name              <-  map["group_name"]
        nickname                <-  map["nickname"]
        photo_from              <-  map["photo_from"]
        photo_h                 <-  map["photo_h"]
        photo_w                 <-  map["photo_w"]
        photo_id                <-  map["photo_id"]
        photo_thumbnail2_h      <-  map["photo_thumbnail2_h"]
        photo_thumbnail2_url    <-  map["photo_thumbnail2_url"]
        photo_thumbnail2_w      <-  map["photo_thumbnail2_w"]
        photo_thumbnail_h       <-  map["photo_thumbnail_h"]
        photo_thumbnail_url     <-  map["photo_thumbnail_url"]
        photo_thumbnail_w       <-  map["photo_thumbnail_w"]
        photo_url               <-  map["photo_url"]
        photo_share_url         <-  map["photo_share_url"]
        thumbup                 <-  map["thumbup"]
        thumbup_num             <-  map["thumbup_num"]
        user_id                 <-  map["user_id"]
        porder                  <-  map["porder"]
        display_payment_btn     <-  map["display_payment_btn"]
        rurl = porder["r_photo_url"] ?? ""
        murl = porder["m_photo_url"] ?? ""
        
        guard let date = created_at else { return }
        let createDateFormatter = DateFormatter()
        createDateFormatter.dateFormat = "yyyy年MM月dd日"
        create_at = createDateFormatter.string(from: date)
        create_at_time_interval = date.getTimeInfoFromDate()
    }
}

extension PhotoItem: IdentifiableType, Equatable {
    public typealias Identity = String
    public var identity: String { return photo_id }
    
    public static func == (lhs: PhotoItem, rhs: PhotoItem) -> Bool {
        return lhs.photo_id == rhs.photo_id
    }
}