const PassportLocalStrategy = require('passport-local').Strategy;
const lbryApi = require('../helpers/lbryApi.js');
const logger = require('winston');
const { db } = require('mysqlConfig');

module.exports = new PassportLocalStrategy(
  {
    usernameField: 'username',
    passwordField: 'password',
  },
  (username, password, done) => {
    logger.verbose(`new channel signup request. user: ${username} pass: ${password} .`);
    let userInfo = {};
    // server-side validaton of inputs (username, password)

    // create the channel and retrieve the metadata
    return lbryApi.createChannel(`@${username}`)
      .then(tx => {
        // create user record
        const userData = {
          userName: username,
          password: password,
        };
        logger.verbose('userData >', userData);
        // create user record
        const channelData = {
          channelName   : `@${username}`,
          channelClaimId: tx.claim_id,
        };
        logger.verbose('channelData >', channelData);
        // create certificate record
        const certificateData = {
          claimId: tx.claim_id,
          name   : `@${username}`,
          // address,
        };
        logger.verbose('certificateData >', certificateData);
        // save user and certificate to db
        return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);
      })
      .then(([newUser, newChannel, newCertificate]) => {
        logger.verbose('user and certificate successfully created');
        // store the relevant newUser info to be passed back for req.User
        userInfo['id'] = newUser.id;
        userInfo['userName'] = newUser.userName;
        userInfo['channelName'] = newChannel.channelName;
        userInfo['channelClaimId'] = newChannel.channelClaimId;
        // associate the instances
        return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);
      })
      .then(() => {
        logger.verbose('user and certificate successfully associated');
        return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);
      })
      .then(shortChannelId => {
        userInfo['shortChannelId'] = shortChannelId;
        return done(null, userInfo);
      })
      .catch(error => {
        logger.error('signup error', error);
        return done(error);
      });
  }
);