const logger = require('winston');
const db = require('../models');

module.exports = {
  getLocalClaimList (name) {
    logger.debug(`db.Claim >> Getting claim_list for "${name}"`);
    return db.Claim.findAll({ name })
    .then(result => {
      logger.debug('db.claim result length', result.length);
      if (result.length >= 1) {
        result = result.map(claim => {
          return claim.dataValues;
        });
        return result;
      } else {
        return null;
      }
    })
    .catch(error => {
      return error;
    });
  },
  resolveLocalUri (name, claimId) {
    logger.debug(`db.Claim >> Resolving "${name}#${claimId}"`);
    db.Claim.findAll({ name, claimId })
    .then(result => {
      if (result) {
        if (result.length > 1) {
          result = result.sort((a, b) => {
            return (a.dataValues.height < b.dataValues.height);
          });
        }
        return result[0].dataValues;
      } else {
        return null;
      }
    })
    .catch(error => {
      return error;
    });
  },
  updateLocalClaimRecordFromResolve (claim) {
    logger.debug('db.Claim >> creating claim entry from lbry resolve results');
    // parse the resolved data
    let claimData = {};
    claimData['address'] = claim.address;
    claimData['amount'] = claim.amount;
    claimData['claimId'] = claim.claim_id;
    claimData['claimSequence'] = claim.claim_sequence;
    claimData['decodedClaim'] = claim.decoded_claim;
    claimData['depth'] = claim.depth;
    claimData['effectiveAmount'] = claim.effective_amount;
    claimData['hasSignature'] = claim.has_signature;
    claimData['height'] = claim.height;
    claimData['hex'] = claim.hex;
    claimData['name'] = claim.name;
    claimData['nout'] = claim.nout;
    claimData['txid'] = claim.txid;
    claimData['validAtHeight'] = claim.valid_at_height;
    claimData['outpoint'] = `${claim.txid}:${claim.nout}`;
    if (claim.value) {
      claimData['claimType'] = claim.value.claimType;
      if (claim.value.stream) {
        if (claim.value.stream.metadata) {
          claimData['author'] = claim.value.stream.metadata.author;
          claimData['description'] = claim.value.stream.metadata.description;
          claimData['language'] = claim.value.stream.metadata.language;
          claimData['licenseUrl'] = claim.value.stream.metadata.licenseUrl;
          claimData['nsfw'] = claim.value.stream.metadata.nsfw;
          claimData['preview'] = claim.value.stream.metadata.preview;
          claimData['thumbnail'] = claim.value.stream.metadata.thumbnail;
          claimData['title'] = claim.value.stream.metadata.title;
          claimData['metadataVersion'] = claim.value.stream.metadata.version;
        }
        if (claim.value.stream.source) {
          claimData['contentType'] = claim.value.stream.source.contentType;
          claimData['source'] = claim.value.stream.source.source;
          claimData['sourceType'] = claim.value.stream.source.sourceType;
          claimData['sourceVersion'] = claim.value.stream.source.version;
        }
        claimData['streamVersion'] = claim.value.stream.version;
      }
      claimData['valueVersion'] = claim.value.version;
    }
    // create search criteria
    const updateCriteria = { name: claimData.name, claimId: claimData.claimId };
    // create entry in db
    db.Claim.update(claimData, updateCriteria)
    .then((rows, result) => {
      logger.debug('successfully updated record in db.Claim');
    })
    .catch(error => {
      logger.error('db.Claim.update error', error);
    });
  },
};